indy post 返回中文编码_delphi – POST响应的TIdHTTP字符编码

如果您使用的是Indy 10的最新版本,那么返回String的TIdHTTP.Post()的重载版本会将数据解码为Unicode,但用于解码的实际字符集取决于哪种媒体类型HTTP Content-Type响应头指定:

>如果媒体类型是application / xml,application / xml-external-parsed-entity,application / xml-dtd,或者不是text / …类型但以xml结尾,那么编码中指定的charset使用XML的prolog属性.如果未指定charset,则使用UTF-8.

>否则,如果Content-Type响应头指定了charset,则使用它.

>否则,如果媒体类型是text / …类型,则:

一个.如果媒体类型是text / xml,text / xml-external-parsed-entity,或以xml结尾,则使用us-ascii.

湾否则使用ISO-8859-1.

>否则,使用Indy的默认编码(默认为ASCII).

如果没有看到实际的HTTP Content-Type标头,很难知道您的情况属于哪种情况.听起来它落入#2或#3b,如果正在使用ISO-8859-1或类似的字符集,它将解释按原样返回的UTF-8字节值.

UTF8ToString()期望UTF-8编码的RawByteString作为输入,但您将传递UTF-16编码的UnicodeString.在这种情况下,RTL将执行UTF16-> Ansi转换,使用默认的Ansi字符集进行转换.这就是您收到编译器警告的原因,因为这样的转换可能会丢失数据.

XML实际上是一种二进制数据格式,受charset编码的限制. XML解析器需要知道XML的编码是什么,并能够相应地解析原始编码的字节.这就是为什么XML在XML prolog中具有明确的编码属性.但是,当TIdHTTP将XML作为字符串下载时,虽然它会自动将其解码为Unicode,但它还没有相应地更新XML的序言.

真正的解决方案是首先不要将XML作为String下载.将其作为TStream下载(TMemoryStream是比TStringStream更好的选择),因此您的XML解析器可以访问原始字节,原始字符集声明等.例如,您可以将TStream传递给TXMLDocument.LoadFromStream()方法.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值