【问题标题】:org.apache.commons.io.IOUtils.toString mis-interpretting UTF-8org.apache.commons.io.IOUtils.toString 错误解释 UTF-8
【发布时间】:2012-08-07 15:51:45
【问题描述】:

我正在尝试从 URI 获取源。它被报告为 UTF-8。我也尝试过 ISO-8859-1、ISO-8859-1 Windows-1250 和 ISO-8859-2。

这是我最近尝试的代码(尝试 ISO-8859-2):

public static String getPage(String page,String charset) throws IOException{
        URL url=new URL(page);

        return org.apache.commons.io.IOUtils.toString(url.openConnection().getInputStream(),charset);
    }

    public static void main(String args[])throws Exception{
        String page=getPage("http://buscon.rae.es/drae/srv/search?val=aba","ISO-8859-2");
        System.out.println(page);
    }

但结果是:

apÄ?ge 'quita, aparta', y este del gr. á¼?Ï?αγγμ)

代替:

(Del lat.apăge 'quita, aparta', y este del gr.ἄπαγε)。

同样,UTF-8(适用于其他代码和浏览器)和其他编码名称也会以类似的方式失败。

【问题讨论】:

  • 在您的示例中返回的 URI 实体使用 UTF-8(对他们有好处,在当今时代,尤其是在网络上,没有必要使用 ISO-8859-2)。我们可以从text/html; charset=UTF-8 标头中看到这一点。它也是西班牙语(在词源中有一些拉丁语和一些希腊语)。这是真正的URI吗?查看 UTF-8 实体无法重现问题。
  • 再见。做一个快速的 .NET 下载器,我得到 (Del lat.apăge 'quita, aparta', y este del gr.ἄπαγε)。如果将其视为 UTF-8。绝对是 UTF-8。
  • 如果我在 Java 中使用 UTF-8 它不会返回相同的
  • 遗憾的是,我知道这个问题的网络和字符编码部分,而不是 Java 部分。您提供的 URI 返回非常好的 UTF-8,这是错误的 Java 位。 (除非您使用不同的 URI,否则罗马尼亚语在哪里出现?)。
  • 这是一个问题。你是怎么看输出的?那里可能存在编码问题吗?奇怪的是,您在 ISO-8859-2 尝试中得到了Ïαγε,因为其中一些字符不在 ISO-8859-2 中!您能否再次尝试使用 UTF-8,并将输出保存到 UTF-8 文本文件而不是写入控制台?也许代码使用 UTF-8 是完美的,但控制台让你失望了。

标签: java url character-encoding


【解决方案1】:

U+0103 (ă) 被编码为字节序列C4 83;此数据为 UTF-8。

该错误可能是由于您通过附加到System.outPrintStream 执行的其他转码操作。这会将数据编码为system encoding,这可能是有损转换,如果写入的设备不使用匹配的编码,可能会导致损坏。

您可以阅读有关 Windows 控制台 here 的一些分析。

【讨论】:

    猜你喜欢
    • 2017-02-21
    • 2017-12-04
    • 2019-02-09
    • 2015-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-22
    • 1970-01-01
    相关资源
    最近更新 更多