【发布时间】:2012-12-24 04:47:02
【问题描述】:
我使用 TIdHttp 来获取网页内容。响应头指示内容编码为 utf8。我想将控制台中的内容打印为 CP936(简体中文),但实际内容不可读。
Result := TEncoding.Utf8.GetString(ResponseBuffer);
我在 python 中做同样的事情(使用 httplib2)没有任何问题。
def python_try():
conn = httplib2.HttpConn()
respose, content = conn.get(...)
print content.decode('utf8') # readable in console
更新 1
我调试了原始响应,发现内容被压缩了。
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Type: text/html;charset=UTF-8
Transfer-Encoding: chunked
Content-Encoding: gzip
Vary: Accept-Encoding
Date: Mon, 24 Dec 2012 15:27:44 GMT
Connection: Keep-Alive
我尝试将 IdCompressorZLib 实例分配给 IdHttp 实例。不幸的是,应用程序在解压缩 gzip 内容时会崩溃。测试地址为“http\://www.baidu.com”(编码=gb2312)。
更新 2
我还尝试下载一个 gzip 压缩的 jquery 脚本文件,它只包含 ascii 字符。这次成功了,这意味着是Indy库的问题。如果我没记错的话,我应该关闭这个问题。
【问题讨论】:
-
缓冲区不会“检测”事物;他们只保存数据。检测的真正目的是什么?您期望收到什么代码页或编码? UTF-8 或 936 是否正确?
-
你说的失败是什么意思?第一个变体应该是您需要的,但它转换为 UTF-16LE,而不是直接转换为您的代码页。最后一个变种已经到了那里,但是转换成很多了吗?我猜你只需要
Cp936Encoding.GetString(TEncoding.Utf8.GetString(ResponseBuffer)); -
python 代码显示变体 1 是正确的,如果变体 1 显示不正确,那么这只是 display 的问题,而不是代码
标签: delphi encoding indy idhttp