【问题标题】:Wrong encoding with Java HttpURLConnectionJava HttpURLConnection 编码错误
【发布时间】:2011-10-23 08:28:10
【问题描述】:

尝试从 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 服务输出 它奇怪地读取大于和小于符号

它读为“ 到“>”没有空格,但如果我在这里输入它们没有空格,stackoverflow 会使它们

请帮忙 谢谢

【问题讨论】:

  • 在我看来,网络服务发送数据不正确。
  • 我已经通过使用 text.toString().replace("<", "")l 解决了这个问题,但我没有不知道为什么会这样。我想知道

标签: java web-services encoding httpurlconnection urlconnection


【解决方案1】:

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

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

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

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

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

查看您的代码 sn-p,我认为 URL 编码(百分比编码)不是您所追求的。

文档字符编码而言。您正在这一行进行转换:

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

conn.getContent() 返回一个InputStream,它对字节进行操作,而阅读器对字符进行操作——字符编码转换在这里完成。检查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 标头,在这种情况下,您必须使用合理的默认值。

【讨论】:

  • 我忘了提到前 2 个 xml 标头通常具有 ,但接下来就是 lt gt ...
【解决方案2】:

Mark Rotteveel 是正确的,网络服务是罪魁祸首,由于某种原因,它使用 & lt 和 & gt 格式发送大于和小于符号

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

【讨论】:

    猜你喜欢
    • 2019-02-10
    • 1970-01-01
    • 1970-01-01
    • 2018-04-23
    • 2016-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多