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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 11:10:41