7

Java を使用してその内容を読み取りたい、奇妙なエンコーディング「UCS-2 リトル エンディアン」のテキスト ファイルがあります。

NotePad++ を使用してテキスト ファイルを開く

上記のスクリーンショットでわかるように、ファイルの内容は Notepad ++ で問題なく表示されますが、このコードを使用して読み取ると、コンソールにガベージが出力されます。

String textFilePath = "c:\strange_file_encoding.txt"
BufferedReader reader = new BufferedReader( new InputStreamReader( new FileInputStream( filePath ), "UTF8" ) );
String line = "";

while ( ( line = reader.readLine() ) != null ) {
    System.out.println( line );  // Prints garbage characters 
}

要点は、ユーザーが読み取るファイルを選択するため、任意のエンコードにすることができます。ファイルのエンコードを検出できないため、「UTF8」を使用してデコードしますが、上記の例のように正しく読み取れません.

そのような奇妙なファイルを正しい方法で読み取る方法はありますか? または、少なくとも、コードが正しく読み取れないかどうかを検出できますか?

4

3 に答える 3

7

InputStreamReader コンストラクターでエンコーディングとして UTF-8 を使用しているため、バイトを UCS-LE ではなく UTF-8 として解釈しようとします。ドキュメントは次のとおりです。Charset

それに応じてUTF-16LEを使用する必要があると思います。

サポートされている文字セットとその Java 名の詳細は次のとおりです: サポートされているエンコーディング

于 2013-03-19T22:34:59.200 に答える
1

で間違ったエンコーディングを提供していますInputStreamReader。UTF8 の代わりに UTF-16LE を使用してみましたか?

BufferedReader reader = new BufferedReader( new InputStreamReader( new FileInputStream( filePath ), "UTF-16LE" ) );

によるとCharset

UTF-16LE 16 ビットの UCS 変換形式、リトル エンディアンのバイト順

于 2013-03-19T22:34:28.673 に答える
1

すべてのファイルに UTF-8 エンコーディングを使用することはできません。特に、どのファイル エンコーディングを予期するかがわからない場合はそうです。ファイルを読み取る前にファイルのエンコーディングを検出できるライブラリを使用します。たとえば、juniversalchardetまたはjChardet です。

詳細については、Java : ストリームの正しい文字セット エンコーディングを確認する方法を参照してください。

于 2013-03-19T22:52:21.343 に答える