3

我正在使用org.apache.commons.httpclient.HttpClient并且需要设置响应编码(由于某种原因,服务器在 Content-Type 中返回了不正确的编码)。我的方法是将响应作为原始字节获取并转换为String所需的编码。我想知道是否有更好的方法来做到这一点(例如设置 HttpClient)。感谢您的建议。

4

4 回答 4

3

我认为使用HttpClient3.x API 没有更好的答案。

HTTP 1.1 规范明确指出客户端“必须”尊重响应标头中指定的字符集,如果未指定字符集,则使用 ISO-8859-1。HttpClientAPI 是基于程序员希望符合 HTTP 规范的假设而设计的。显然,您需要打破规范中的规则,以便与不合规的服务器通信。尽管如此,这并不是 API 设计人员认为需要明确支持的用例。

如果您使用的是HttpClient4.x,您可以自己编写ResponseHandler将正文转换为HttpEntity,忽略响应消息的名义字符集。

于 2011-02-28T15:08:08.383 回答
2

几点注意事项:

  1. 服务器提供数据,因此由服务器以适当的格式提供数据。所以响应编码是由服务器而不是客户端设置的。但是,客户端可以通过Accept 和 Accept-Charset向服务器建议它想要的格式:

    Accept: text/plain
    Accept-Charset: utf-8
    

    但是,http 服务器通常不会在格式之间进行转换。

  2. 如果选项 1. 不起作用,那么您应该查看服务器的配置。

  3. 当字符串作为原始字节发送时(它总是这样,因为这是网络传输的内容),总是有定义的编码。由于服务器产生这个原始字节,它定义了编码。因此,您不能获取原始字节并使用您选择的编码来创建字符串。您必须使用从字符串转换为字节时使用的编码。

于 2011-02-28T14:16:31.913 回答
0

免责声明:我并不真正了解 HttpClient,仅阅读 API。

我将使用返回 HttpResponse 的 execute 方法,然后.getEntity().getContent(). 这是一个纯字节流,所以如果你想忽略服务器告诉的编码,你可以简单地将你自己的 InputStreamReader 包裹在它周围。


HttpClient好的,看起来我的版本错误(显然,那里的课程太多了)。

但和以前一样,只是位于其他类上:HttpMethod有一个getResponseBodyAsStream()方法,您现在可以围绕该方法包装自己的 InputStreamReader。(或者一次获取整个数组,如果它不是太大,然后将其转换为字符串,就像你写的那样。)

我认为尝试更改响应并让 HttpClient 分析它不是正确的方法。


不过,我建议向服务器管理员/网站管理员发送一条关于错误字符集的消息。

于 2011-02-28T21:13:50.890 回答
0

问候各位,

以防万一有人发现这篇文章在谷歌上搜索设置 HttpClient 以使用 UTF-8 编写。

这行代码应该很方便...

response.setContentType("text/html; charset=UTF-8");

最好的

于 2011-03-10T14:26:57.687 回答