Leggere InputStream come UTF-8


96

Sto cercando di leggere da un text/plainfile su Internet, riga per riga. Il codice che ho in questo momento è:

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

Il file test.txt,, contiene ¡Hélló!, che sto usando per testare la codifica.

Quando rivedo il OutputStream( out), lo vedo come > ¬°H√©ll√≥!. Non credo che questo sia un problema con il OutputStreampoiché posso fare out.println("é");senza problemi.

Qualche idea per la lettura dal formato InputStreamUTF-8? Grazie!


1
Il protocollo HTTP specifica la codifica. Perché non stai utilizzando un'API di libreria che lo gestisce per te? Non dovresti mai indovinare la codifica in questo modo. Non voglio essere negativo: stai andando alla grande! Mi chiedo solo se non ci sia un modo più semplice.
tchrist

1
text/plainSfortunatamente non avrò accesso al server che serve il file e non utilizza una codifica UTF-8. Non ero a conoscenza di nessuna buona libreria di rete; eventuali suggerimenti?
Chris Kuehl,

1
Guardando i documenti , non penserei che dovresti specificare la codifica. Sono sorpreso che ti diano un flusso di byte! Hai accesso a URLConnection sottostante , da cui puoi controllare Content-Encoding, quindi aprire un InputStreamReader con l'argomento corretto. Un rapido controllo della fonte non rivela nulla che sembri farlo per te, il che sembra dannatamente zoppo e soggetto a errori, quindi probabilmente mi sono perso qualcosa.
tchrist

Risposte:


189

Ho risolto il mio problema. Questa linea:

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

deve essere:

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

o da Java 7:

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

3
Sono abbastanza sicuro che la forma del costruttore non solleverà un'eccezione su input non valido. Devi usare il con un CharsetDecoder decargomento. Questo è lo stesso bug di progettazione Java che hanno i OutputStreamWritercostruttori: solo uno dei quattro in realtà accontenta di dirti quando qualcosa va storto. Anche in questo caso devi usare l' CharsetDecoder decargomento di fantasia . L'unica cosa sicura e sensata da fare è considerare tutti gli altri costruttori deprecati, perché non ci si può fidare del loro comportamento.
tchrist

6
Da Java 7 è possibile scrivere il StandardCharsets.UTF_8
tobijdc

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

}

Prova questo,.. :-)


8
Invece di file + = str, crea uno StringBuilder e aggiungi a quello. Il compilatore potrebbe essere in grado di ottimizzare l'aggiunta della stringa, ma probabilmente sta creando un sacco di spazzatura
seand

2
Se vuoi convertire un BufferedReader in una stringa, usa Apache Commons, non reinventare il motivo: String myStr = org.apache.commons.io.IOUtils.toString (myBufferedReaderInstance);
Jaime Marín,

8
UTF8 = "utf8", bella variabile;)
Nicofisi

7

Mi sono imbattuto nello stesso problema ogni volta che trova un carattere speciale lo contrassegna come . per risolvere questo problema, ho provato a utilizzare la codifica: ISO-8859-1

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

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

}

Spero che questo possa aiutare chiunque veda questo post.


1
Potresti per favore dire quali sono i caratteri non supportati in UTF-8?
USM
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.