2013-02-26 10 views
5

Widzę, że możesz określić UTF-16 jako zestaw znaków przez Charset.forName("UTF-16"), i że możesz utworzyć nowy dekoder UTF-16 przez Charset.forName("UTF-16").newDecoder(), ale widzę tylko możliwość określenia CharsetDecoder na konstruktorze InputStreamReader.Jak wymusić kodowanie UTF-16 podczas odczytu/zapisu w Javie?

Jak w jaki sposób określić, aby używać UTF-16 podczas czytania dowolnego strumienia w Javie?

+1

Jeśli klasa na to pozwala, można to zrobić na granicy między strumieniem bajtów i strumień znaków. (InputStreamReader to jedna z takich klas, dla innych czytników, które nie dają opcji określenia zestawu znaków, po prostu owinąć wokół InputStreamReader). Niższa konstrukcja na poziomie InputStream (strumień bajtów) nie ma pojęcia zestawu znaków. – nhahtdh

Odpowiedz

11

Strumienie wejściowe zajmują się surowymi bajtami. Kiedy czytasz bezpośrednio ze strumienia wejściowego, otrzymujesz tylko surowe bajty, w których zestawy znaków są nieistotne.

Interpretacja surowych bajtów w znaki, z definicji, wymaga pewnego rodzaju tłumaczenia: w jaki sposób mogę przetłumaczyć surowe bajty na czytelny ciąg znaków? To "tłumaczenie" ma postać zestawu znaków.

Ta "dodana" warstwa jest implementowana przez Czytniki. Dlatego aby odczytywać znaki (zamiast bajtów) ze strumienia, musisz zbudować pewien rodzaj (zależnie od potrzeb) nad strumieniem. Na przykład:

InputStream is = ...; 
Reader reader = new InputStreamReader(is, Charset.forName("UTF-16")); 

Spowoduje reader.read() czytać znaków za pomocą zestawu znaków podałeś. Jeśli chcesz przeczytać całą linie, użyj BufferedReader na górze:

BufferedReader reader = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-16"))); 
String line = reader.readLine(); 
Powiązane problemy