【发布时间】:2014-10-02 09:40:00
【问题描述】:
我在向 IIS 服务器发出 HTTP 请求的 Java 应用程序中遇到了一些编码问题。
遍历URLConnection 对象的标头,我可以看到以下(相关)标头:
Transfer-Encoding: [chunked]
Content-Encoding: [utf-8]
Content-Type: [text/html; charset=utf-8]
URLConnection.getContentEncoding() 方法返回 utf-8 作为文档编码。
这就是我的 HTTP 请求和流读取的方式:
OutputStreamWriter sw = null;
BufferedReader br = null;
char[] buffer = null;
URL url;
url = new URL(this.URL);
URLConnection connection = url.openConnection();
connection.setDoOutput(true);
sw = new OutputStreamWriter(connection.getOutputStream());
sw.write(postData);
sw.flush();
br = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF8"));
StringBuilder totalResponse = new StringBuilder();
String line;
while((line = br.readLine()) != null) {
totalResponse.append(line);
}
buffer = totalResponse.toString().toCharArray();
if (sw != null)
sw.close();
if (br != null)
br.close();
return buffer;
但是,服务器发送的以下字符串“ÃÃÃção”被客户端接收为“�����o”。
我做错了什么?
【问题讨论】:
-
我认为它必须是
UTF-8而不是UTF8 -
感谢@Tirath 的回复。我已将 UTF8 更改为 UTF-8 作为 InputStreamReader 构造函数的参数,但结果是一样的。
-
您确定您的内容是实际上 UTF-8 编码的吗?标题可以撒谎。你也试过调试
totalResponse.toString()吗?如果等于"ÃÃÃção",那么在char[]上操作时,您的问题可能会更进一步... -
谢谢@Mena,我如何实际上验证内容编码。使用:
byte[] foo = String.valueOf(totalResponse.toString()).getBytes(); System.out.println(new String(foo, "utf-8"));得到完全相同的结果。 -
可能不相关,但您还应该在创建
OutputStreamWriter时设置显式编码 - 此时您正在以平台上的默认编码发送帖子数据,这可能不是服务器所期望的。
标签: java http encoding inputstreamreader