Delphi THTTPClient调用ContentAsString()返回乱码求助
Delphi THTTPClient 获取UTF-16编码响应乱码解决办法
问题描述
使用Delphi的THTTPClient组件调用lHttpResp.ContentAsString()时,得到疑似UTF-16编码的乱码内容:
㰀㼀砀洀氀 瘀攀爀猀椀漀渀㴀∀⸀ ∀ 攀渀挀漀搀椀渀最㴀∀唀吀䘀ⴀ㘀∀ 猀琀愀渀搀愀氀漀渀攀㴀∀礀攀猀∀㼀㸀㰀刀䔀匀唀䰀吀㸀 㰀倀䄀夀倀䄀䜀䔀唀刀䰀㸀栀琀琀瀀猀㨀⼀⼀攀攀⸀琀攀猀琀⸀瀀愀礀最愀琀攀眀愀礀⸀挀漀洀⼀䠀漀猀琀倀愀礀匀攀爀瘀椀挀攀⼀瘀⼀栀漀猀琀瀀愀礀⼀瀀愀礀瀀愀最攀⼀㘀㜀 㔀㘀㘀㈀㔀㐀㌀㈀㐀欀䬀䬀儀㔀唀漀䈀椀吀氀㠀䔀爀䈀䴀 戀㰀⼀倀䄀夀倀䄀䜀䔀唀刀䰀㸀 㰀匀䔀匀匀䤀伀一吀伀䬀䔀一㸀㘀㜀 㔀㘀㘀㈀㔀㐀㌀㈀㐀欀䬀䬀儀㔀唀漀䈀椀吀氀㠀䔀爀䈀䴀 戀㰀⼀匀䔀匀匀䤀伀一吀伀䬀䔀一㸀㰀⼀刀䔀匀唀䰀吀㸀
通过Fiddler查看,原始视图和文本视图显示正常的XML内容:
<?xml version="1.0" encoding="UTF-16" standalone="yes"?><RESULT> <PAYPAGEURL>https://url/</PAYPAGEURL> <SESSIONTOKEN>1670565241202KKv4NPBBScANOL6rxbi</SESSIONTOKEN></RESULT>
尝试过用TEncoding进行编码转换,但未解决问题。
解决步骤
方法1:直接指定编码获取内容
THTTPClient的ContentAsString方法可接收TEncoding参数,直接指定UTF-16编码即可正确解析:
var lHttpClient: THTTPClient; lHttpResp: IHTTPResponse; lCorrectContent: string; begin lHttpClient := THTTPClient.Create; try lHttpResp := lHttpClient.Get('你的请求URL'); // 通常Windows环境下响应为UTF-16LE,用TEncoding.Unicode;若为UTF-16BE则用TEncoding.BigEndianUnicode lCorrectContent := lHttpResp.ContentAsString(TEncoding.Unicode); // 后续业务逻辑处理 finally lHttpClient.Free; end; end;
方法2:通过字节流手动转换
如果方法1无效,可先获取原始字节流,再用UTF-16编码转换为字符串:
var lHttpClient: THTTPClient; lHttpResp: IHTTPResponse; lBytes: TBytes; lCorrectContent: string; begin lHttpClient := THTTPClient.Create; try lHttpResp := lHttpClient.Get('你的请求URL'); lBytes := lHttpResp.ContentAsBytes; // 根据实际字节序选择对应编码 lCorrectContent := TEncoding.Unicode.GetString(lBytes); // 后续业务逻辑处理 finally lHttpClient.Free; end; end;
注意事项
- 确认响应的UTF-16字节序:若服务端返回UTF-16BE,需替换为
TEncoding.BigEndianUnicode;多数Windows环境下为UTF-16LE,用TEncoding.Unicode即可。 - 检查响应头
Content-Type是否包含charset=utf-16,若服务端未正确返回该标识,THTTPClient会默认用UTF-8解析,导致乱码。
内容的提问来源于stack exchange,提问作者user2814916
相关产品推荐
相关产品推荐

