繁体   English   中英

Java HttpURLConnection编码错误

[英]Wrong encoding with Java HttpURLConnection

尝试从MS Web服务读取生成的XML

URL page = new URL(address);
StringBuffer text = new StringBuffer();
HttpURLConnection conn = (HttpURLConnection) page.openConnection();
conn.connect();
InputStreamReader in = new InputStreamReader((InputStream) conn.getContent());
BufferedReader buff = new BufferedReader(in);
box.setText("Getting data ...");
String line;
do {
  line = buff.readLine();
  text.append(line + "\n");
} while (line != null);
box.setText(text.toString());

要么

URL u = new URL(address);
URLConnection uc = u.openConnection();
BufferedReader in = new BufferedReader(new InputStreamReader(uc.getInputStream()));
String inputLine;
while ((inputLine = in.readLine()) != null) {

    inputLine = java.net.URLDecoder.decode(inputLine, "UTF-8");
  System.out.println(inputLine);
}
in.close();

任何页面都可以正常读取,除非Web服务输出奇怪地读取了大于和小于符号

它读取<到“&lt;” 和>到“&gt;” 没有空格,但是如果我在这里输入它们而没有空格stackoverflow使它们<和>

请帮忙谢谢

首先,这一行似乎有些混乱:

inputLine = java.net.URLDecoder.decode(inputLine, "UTF-8");

这实际上表示您希望服务器提供的文档中的每一行都经过URL编码。 URL编码与文档编码不同。

http://en.wikipedia.org/wiki/Percent-encoding

http://en.wikipedia.org/wiki/Character_encoding

查看您的代码片段,我认为URL编码(百分比编码)不是您想要的。

文档字符编码方面。 您正在此行进行转换:

InputStreamReader in = new InputStreamReader((InputStream) conn.getContent());

conn.getContent()返回一个InputStreamconn.getContent()字节进行操作,而阅读器对chars进行操作-字符编码转换在此完成。 检出InputStreamReader的其他构造函数,该构造函数将编码作为第二个参数。 没有第二个参数,您将退回到Java平台的默认值上。

InputStreamReader(InputStream in, String charsetName)

例如,让您将代码更改为:

InputStreamReader in = new InputStreamReader((InputStream) conn.getContent(), "utf-8");

但是真正的问题将是“服务器以哪种编码提供内容?” 如果您也拥有服务器代码,则可以将其硬编码为诸如utf-8合理代码。 但是,如果它可以变化,则需要查看http标头的Content-Type来找出它。

String contentType = conn.getHeaderField("Content-Type");

contentType的内容看起来像

text/plain; charset=utf-8

获得该字段的简便方法是:

String contentEncoding = conn.getContentEncoding();

注意,很可能没有提供字符集或没有Content-Type头,在这种情况下,您必须使用合理的默认值。

Mark Rotteveel是正确的,Web服务是罪魁祸首,出于某种原因,它发送带有&lt和&gt格式的大于和小于符号

感谢Martin Algesten,但我已经说过要解决这个问题,我只是在寻找为什么这样做。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM