首页 > 解决方案 > 将多字节十六进制转换回 UTF-8 字符串

问题描述

标签: stringdelphiutf-8

解决方案


我没有迹象表明它是 4 个字符长的欧元符号,而不是 2 个字符

仅由于这个原因,您根本无法转换"61626320AC""abc€",因为您不知道哪些十六进制代码是 2 位数字,哪些是 4 位数字,您没有区分它们。例如,十六进制代码61626263代表有效的 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;

推荐阅读