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
相关产品推荐
相关产品推荐

