将InputStream读取为UTF-8


96

我正在尝试text/plain逐行从Internet 上读取文件。我现在拥有的代码是:

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ó!,以测试编码。

当我查看OutputStreamout)时,看到的是> ¬°H√©ll√≥!。我不相信这是有问题的,OutputStream因为我可以做到out.println("é");没有问题。

对于InputStream作为UTF-8的阅读形式有什么想法吗?谢谢!


1
HTTP协议指定编码。您为什么不使用可为您处理的库API?您永远不必猜测这样的编码。我并不是说要消极:您做得很好!我只是想知道是否有更简单的方法。
tchrist 2011年

1
text/plain不幸的是,我将无法访问正在提供文件的服务器,并且该服务器未使用UTF-8编码。我不知道有什么好的网络库。有什么建议?
克里斯·库尔

1
查看文档,我认为您根本不必指定编码。我很惊讶他们给你一个字节流!你有机会获得潜在的URLConnection,从中你可以检查内容编码,然后打开用正确的参数的InputStreamReader。快速检查源代码并不会发现可以为您执行此操作的任何内容,这似乎很脚,容易出错,因此我可能错过了一些东西。
tchrist 2011年

Answers:


189

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

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));

3
我很确定构造函数的形式不会在无效输入上引发异常。您需要将with与CharsetDecoder dec参数一起使用。这与OutputStreamWriter构造函数所具有的Java设计错误相同:四个问题中只有一个实际上屈服于告诉您什么时候出了问题。您也必须再次在其中使用fancy CharsetDecoder dec参数。唯一安全和理智的事情是考虑所有其他已弃用的构造函数,因为它们不能被信任表现出来。
tchrist 2011年

6
由于Java 7,可以将提供的字符集作为常量而不是字符串StandardCharsets.UTF_8
编写

18
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) {

}

试试这个,.. :-)


8
代替文件+ = str,创建一个StringBuilder并将其追加。编译器也许可以优化字符串附加,但是可能会产生很多垃圾
2013年

2
如果要将BufferedReader转换为字符串,请使用Apache Commons,不要重蹈覆辙:String myStr = org.apache.commons.io.IOUtils.toString(myBufferedReaderInstance);
JaimeMarín'16

8
UTF8 =“ utf8”,变量不错;)
Nicofisi

7

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

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

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

}

我希望这可以对任何看到此帖子的人有所帮助。


1
您能告诉我UTF-8不支持哪些字符吗?
USM
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.