【问题标题】:Reading InputStream as UTF-8将 InputStream 读取为 UTF-8
【发布时间】:2011-06-25 06:41:12
【问题描述】:

我正在尝试通过互联网逐行读取text/plain 文件。我现在的代码是:

URL url = new URL("http://kuehldesign.net/test.txt");
BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
LinkedList<String> lines = new LinkedList();
String readLine;

while ((readLine = in.readLine()) != null) {
    lines.add(readLine);
}

for (String line : lines) {
    out.println("> " + line);
}

文件test.txt 包含¡Hélló!,我使用它来测试编码。

当我查看OutputStream (out) 时,我看到它是&gt; ¬°H√©ll√≥!。我不认为这是OutputStream 的问题,因为我可以毫无问题地使用out.println("é");

对于将InputStream 格式读取为 UTF-8 有什么想法吗?谢谢!

【问题讨论】:

  • HTTP 协议指定编码。你为什么不使用为你处理这些的库 API?您永远不必像这样猜测编码。我并不是要消极:你做得很好!我只是想知道是否没有更简单的方法。
  • 很遗憾,我无法访问为text/plain 文件提供服务的服务器,而且它没有使用UTF-8 编码。我不知道有什么好的网络库。有什么建议吗?
  • 查看docs,我认为您根本不需要指定编码。我很惊讶他们给了你一个字节流!您确实可以访问底层URLConnection,您可以从中检查 Content-Encoding,然后使用正确的参数打开 InputStreamReader。快速检查源代码并没有发现任何似乎对你有用的东西,这看起来很糟糕而且容易出错,所以我可能错过了一些东西。

标签: java utf-8 inputstream


【解决方案1】:

解决了我自己的问题。这一行:

BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));

需要:

BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream(), "UTF-8"));

或从 Java 7 开始:

BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream(), StandardCharsets.UTF_8));

【讨论】:

  • 我很确定构造函数的形式不会在输入无效时引发异常。您需要使用 CharsetDecoder dec 参数。这与OutputStreamWriter 构造函数具有相同的Java 设计错误:当出现问题时,四个中只有一个实际上屈尊告诉您。您还必须在那里使用花哨的CharsetDecoder dec 参数。唯一安全和理智的做法是考虑弃用所有其他构造函数,因为不能信任它们的行为。
  • 从 Java 7 开始,可以将提供的字符集写为常量而不是字符串StandardCharsets.UTF_8
【解决方案2】:
String file = "";

try {

    InputStream is = new FileInputStream(filename);
    String UTF8 = "utf8";
    int BUFFER_SIZE = 8192;

    BufferedReader br = new BufferedReader(new InputStreamReader(is,
            UTF8), BUFFER_SIZE);
    String str;
    while ((str = br.readLine()) != null) {
        file += str;
    }
} catch (Exception e) {

}

试试这个,.. :-)

【讨论】:

  • 而不是文件 += str,创建一个 StringBuilder 并附加到它。编译器可能能够优化字符串附加,但它可能会产生很多垃圾
  • 如果要将 BufferedReader 转换为字符串,请使用 Apache Commons,不要重蹈覆辙:String myStr = org.apache.commons.io.IOUtils.toString(myBufferedReaderInstance);
  • UTF8 = "utf8", 不错的变量 ;)
【解决方案3】:

每次发现一个特殊字符将其标记为��时,我都会遇到同样的问题。为了解决这个问题,我尝试使用编码:ISO-8859-1

BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("txtPath"),"ISO-8859-1"));

while ((line = br.readLine()) != null) {

}

我希望这可以帮助任何看到这篇文章的人。

【讨论】:

  • 能否请您说出 UTF-8 不支持的字符是什么?
猜你喜欢
  • 2012-07-21
  • 2015-08-13
  • 2019-05-21
  • 1970-01-01
  • 1970-01-01
  • 2011-10-26
  • 2015-06-05
  • 2017-06-28
  • 1970-01-01
相关资源
最近更新 更多