InputStreamをUTF-8として読み取る


96

text/plainインターネット経由でファイルを1行ずつ読み込もうとしています。私が今持っているコードは:

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

1
text/plain残念ながら、ファイルを提供しているサーバーにアクセスできず、UTF-8エンコーディングを使用していません。良いネットワークライブラリについては知りませんでした。助言がありますか?
Chris Kuehl、2011

1
docsを見ると、エンコーディングを指定する必要はまったくないと思います。彼らがあなたにバイトストリームを与えることに驚いています!基礎となるURLConnectionにアクセスできます。そこからContent-Encodingを確認し、正しい引数でInputStreamReaderを開くことができます。ソースを簡単にチェックしても、あなたのためにそれをしているように見えるものは何も見つかりません。
tchrist

回答:


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
コンストラクターの形式が無効な入力で例外を発生させないと確信しています。をCharsetDecoder dec引数とともに使用する必要があります。これは、OutputStreamWriterコンストラクターが持っているのと同じJava設計のバグです。4つのうちの1つだけが実際に降りて何かがうまくいかない場合に通知します。ここでも、派手なCharsetDecoder dec引数を使用する必要があります。安全で健全な唯一のことは、他のすべてのコンストラクターを廃止することを検討することです。
tchrist

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を使用し、whealを再発明しないでください。
JaimeMarín2016年

8
UTF8 = "utf8"、nice variable;)
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、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.