You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Delphi 10.4 如何将含多字节字符的十六进制串还原为正常字符串

问题根因

你当前的字符串转十六进制逻辑输出的是变长十六进制片段:ASCII字符(码值≤255)输出2位十六进制,码值大于255的Unicode字符输出4位,拼接后无分隔标识,还原时无法自动区分2位/4位片段的边界,自然会出现拆分错误、多字节字符乱码的问题。

最优解决方案

建议修改编码逻辑,统一每个Unicode字符(UTF-16码元)输出固定4位十六进制,从根源上消除歧义,对应的编码、解码实现如下:

1. 优化后的字符串转十六进制函数

function StrToHex(const Input: string): string;
var
  i: Integer;
begin
  Result := '';
  for i := 1 to Length(Input) do
  begin
    // 固定每个Unicode码元输出4位十六进制,不足补前导0
    Result := Result + IntToHex(Ord(Input[i]), 4);
  end;
end;

2. 对应十六进制转字符串函数

function HexToStr(const HexStr: string): string;
var
  i, CharCode: Integer;
begin
  Result := '';
  // 合法的十六进制串长度必须是4的整数倍
  if Length(HexStr) mod 4 <> 0 then Exit;
  for i := 1 to Length(HexStr) step 4 do
  begin
    CharCode := StrToInt('$' + Copy(HexStr, i, 4));
    Result := Result + WideChar(CharCode);
  end;
end;

兼容现有旧十六进制串的处理方案

如果需要兼容你当前逻辑已经生成的十六进制串,可参考如下实现(注意:旧逻辑本身存在歧义,仅能适配绝大多数常规场景,极端场景仍可能出现转码错误):

function OldHexToStr(const HexStr: string): string;
var
  i, Len, CharCode: Integer;
begin
  Result := '';
  i := 1;
  Len := Length(HexStr);
  while i <= Len do
  begin
    if i + 1 > Len then Break;
    CharCode := StrToInt('$' + Copy(HexStr, i, 2));
    // 小于0x80判定为标准ASCII字符,按2位处理,否则按4位处理
    if (CharCode < $80) or (i + 3 > Len) then
    begin
      Result := Result + WideChar(CharCode);
      Inc(i, 2);
    end
    else
    begin
      CharCode := StrToInt('$' + Copy(HexStr, i, 4));
      Result := Result + WideChar(CharCode);
      Inc(i, 4);
    end;
  end;
end;

内容的提问来源于stack exchange,提问作者Anse

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 05:45:08