我正在使用org.apache.commons.httpclient.HttpClient
并且需要设置响应编码(由于某种原因,服务器在 Content-Type 中返回了不正确的编码)。我的方法是将响应作为原始字节获取并转换为String
所需的编码。我想知道是否有更好的方法来做到这一点(例如设置 HttpClient)。感谢您的建议。
4 回答
我认为使用HttpClient
3.x API 没有更好的答案。
HTTP 1.1 规范明确指出客户端“必须”尊重响应标头中指定的字符集,如果未指定字符集,则使用 ISO-8859-1。HttpClient
API 是基于程序员希望符合 HTTP 规范的假设而设计的。显然,您需要打破规范中的规则,以便与不合规的服务器通信。尽管如此,这并不是 API 设计人员认为需要明确支持的用例。
如果您使用的是HttpClient
4.x,您可以自己编写ResponseHandler
将正文转换为HttpEntity
,忽略响应消息的名义字符集。
几点注意事项:
服务器提供数据,因此由服务器以适当的格式提供数据。所以响应编码是由服务器而不是客户端设置的。但是,客户端可以通过Accept 和 Accept-Charset向服务器建议它想要的格式:
Accept: text/plain Accept-Charset: utf-8
但是,http 服务器通常不会在格式之间进行转换。
如果选项 1. 不起作用,那么您应该查看服务器的配置。
当字符串作为原始字节发送时(它总是这样,因为这是网络传输的内容),总是有定义的编码。由于服务器产生这个原始字节,它定义了编码。因此,您不能获取原始字节并使用您选择的编码来创建字符串。您必须使用从字符串转换为字节时使用的编码。
免责声明:我并不真正了解 HttpClient,仅阅读 API。
我将使用返回 HttpResponse 的 execute 方法,然后.getEntity().getContent()
. 这是一个纯字节流,所以如果你想忽略服务器告诉的编码,你可以简单地将你自己的 InputStreamReader 包裹在它周围。
HttpClient
好的,看起来我的版本错误(显然,那里的课程太多了)。
但和以前一样,只是位于其他类上:HttpMethod
有一个getResponseBodyAsStream()
方法,您现在可以围绕该方法包装自己的 InputStreamReader。(或者一次获取整个数组,如果它不是太大,然后将其转换为字符串,就像你写的那样。)
我认为尝试更改响应并让 HttpClient 分析它不是正确的方法。
不过,我建议向服务器管理员/网站管理员发送一条关于错误字符集的消息。
问候各位,
以防万一有人发现这篇文章在谷歌上搜索设置 HttpClient 以使用 UTF-8 编写。
这行代码应该很方便...
response.setContentType("text/html; charset=UTF-8");
最好的