Charset.forName("UTF-16")
を介してUTF-16を文字セットとして指定でき、Charset.forName("UTF-16").newDecoder()
で新しいUTF-16デコーダを作成できますが、InputStreamReader
のコンストラクタにはCharsetDecoder
を指定する機能しか表示されません。Javaで読み書き中にUTF-16を強制する方法は?
どのようにJavaでストリームを読み取っているときにUTF-16を使用するように指定しますか?
Charset.forName("UTF-16")
を介してUTF-16を文字セットとして指定でき、Charset.forName("UTF-16").newDecoder()
で新しいUTF-16デコーダを作成できますが、InputStreamReader
のコンストラクタにはCharsetDecoder
を指定する機能しか表示されません。Javaで読み書き中にUTF-16を強制する方法は?
どのようにJavaでストリームを読み取っているときにUTF-16を使用するように指定しますか?
入力ストリームは生のバイトを処理します。入力ストリームから直接読み込むと、文字セットが関係しない生のバイトだけが得られます。
生のバイトを文字に解釈するには、定義上、何らかの翻訳が必要です。生のバイトから読み込み可能な文字列に変換するにはどうすればよいですか?その "翻訳"は文字セットの形で来ます。
この「追加された」レイヤーは、リーダーによって実装されます。したがって、ストリームから文字(バイトではなく)を読み取るには、ストリームの上に何らかの並べ替え(ニーズに応じて)をReader
で作成する必要があります。たとえば:
InputStream is = ...;
Reader reader = new InputStreamReader(is, Charset.forName("UTF-16"));
これは、あなたが指定した文字セットを使用して文字を読み取ることがreader.read()
の原因となります。あなたが上にBufferedReader
を使用し、全体のラインを読みたい場合は、次の
BufferedReader reader = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-16")));
String line = reader.readLine();
クラスがそれを可能にする場合は、バイトストリームと文字ストリームの境界で行うことができます。 (InputStreamReaderはそのようなクラスの1つで、文字セットを指定するオプションを持たない他のReader用で、InputStreamReaderの周りにラップするだけです)。 InputStream(バイトストリーム)のレベルの下位構造には、文字セットの概念がありません。 – nhahtdh