在 Delphi 10.4 中,我有一個字串的十六進制表示:
function TForm1.Button2Click(Sender: TObject);
var
i, nr : integer;
Input, HexStr, h: String;
begin
HexStr := '';
Input := Edit2.Text;
for i:=1 to Length(Input) do begin
nr := Ord(Input[i]);
h := IntToHex(nr, 0);
if Length(h) = 1 then
h := '0' h;
HexStr := HexStr h;
end;
Edit3.Text := HexStr;
end;
對于“ abc€ ”,我在這里得到“ 61626320AC”。請注意,€ 符號會轉換為“20AC”。現在為了將其轉換回普通字串,我將該十六進制拆分為 2 個字符對,并使用StrToInt()'$' 前綴。我沒有跡象表明€符號的長度為 4 個字符,而不是 2 個字符,這打破了歐元符號:

如何在不破壞多位元組字符的情況下轉換回這樣的十六進制字串?
uj5u.com熱心網友回復:
我沒有指示它是 4 個字符長的 € 符號,而不是 2 個字符
僅因為這個原因,您根本無法轉換"61626320AC"回"abc€",因為您不知道哪些十六進制代碼是 2 位數字,哪些是 4 位數字,因此您沒有對它們進行分隔。例如,十六進制代碼6162和6263也代表了有效的Unicode字符,太。
正如@TomBrunberg 在評論中提到的,您可以為每個字符使用 4 位十六進制代碼,例如:
function TForm1.Button2Click(Sender: TObject);
var
i, nr : integer;
Input, HexStr, h: String;
begin
HexStr := '';
Input := Edit2.Text;
for i := Low(Input) to High(Input) do begin
nr := Ord(Input[i]);
h := IntToHex(nr, 4);
HexStr := HexStr h;
end;
Edit3.Text := HexStr;
end;
然后,您可以通過在呼叫時將十六進制字串拆分為 4 個字符的組來轉換回來StrToInt(),例如:
function TForm1.Button3Click(Sender: TObject);
var
i, nr : integer;
Output, HexStr, h: String;
begin
HexStr := Edit3.Text;
Output := '';
i := Low(HexStr);
while i <= High(HexStr) do begin
h := Copy(HexStr, i, 4);
nr := StrToInt('$' h);
Output := Output Char(nr);
Inc(i, 4);
end;
Edit2.Text := Output;
end;
或者,正如@AmigoJack 所暗示的那樣,您可以改用 UTF-8,例如:
function TForm1.Button2Click(Sender: TObject);
var
i, nr : integer;
HexStr, h: String;
Input: UTF8String;
begin
HexStr := '';
Input := UTF8String(Edit2.Text);
for i := Low(Input) to High(Input) do begin
nr := Ord(Input[i]);
h := IntToHex(nr, 2);
HexStr := HexStr h;
end;
Edit3.Text := HexStr;
end;
function TForm1.Button3Click(Sender: TObject);
var
i, nr : integer;
HexStr, h: String;
Output: UTF8String;
begin
HexStr := Edit3.Text;
Output := '';
i := Low(HexStr);
while i <= High(HexStr) do begin
h := Copy(HexStr, i, 2);
nr := StrToInt('$' h);
Output := Output AnsiChar(nr);
Inc(i, 2);
end;
Edit2.Text := string(Output);
end;
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/357944.html
