web-dev-qa-db-ja.com

Java FileReaderエンコードの問題

Java.io.FileReaderを使用していくつかのテキストファイルを読み取って文字列に変換しようとしましたが、結果が間違ってエンコードされており、まったく読み取れませんでした。

私の環境は次のとおりです。

  • Windows 2003、OSエンコード:CP1252

  • Java 5.0

私のファイルはUTF-8エンコードまたはCP1252エンコードされており、それらの一部(UTF-8エンコードファイル)には中国語(非ラテン)文字が含まれている場合があります。

次のコードを使用して作業を行います。

   private static String readFileAsString(String filePath)
    throws Java.io.IOException{
        StringBuffer fileData = new StringBuffer(1000);
        FileReader reader = new FileReader(filePath);
        //System.out.println(reader.getEncoding());
        BufferedReader reader = new BufferedReader(reader);
        char[] buf = new char[1024];
        int numRead=0;
        while((numRead=reader.read(buf)) != -1){
            String readData = String.valueOf(buf, 0, numRead);
            fileData.append(readData);
            buf = new char[1024];
        }
        reader.close();
        return fileData.toString();
    }

上記のコードは機能しません。テキストがUTF-8エンコードされている場合でも、FileReaderのエンコードはCP1252であることがわかりました。しかし、Java.io.FileReaderのJavaDocには次のように書かれています。

このクラスのコンストラクターは、デフォルトの文字エンコーディングとデフォルトのバイトバッファーサイズが適切であることを前提としています。

これは、FileReaderを使用している場合、自分で文字エンコードを設定する必要がないということですか?しかし、私は現在間違ったエンコードされたデータを取得しました。私の状況に対処する正しい方法は何ですか?ありがとう。

124
nybon

はい、あなたは読み取りたいファイルのエンコーディングを指定する必要があります

はい、これはknow読みたいファイルのエンコーディングをしなければならないことを意味します。

いいえ、guessに与えられた「プレーンテキスト」ファイルのエンコーディングの一般的な方法はありません。

FileReader のコンストラクターは、常にプラットフォームのデフォルトエンコーディングを常に使用します。これは、一般的に悪い考えです。

FileReaderの代わりに、 new InputStreamReader(new FileInputStream(pathToFile), <encoding>)を使用する必要があります。

233
Joachim Sauer

FileReaderはJavaのプラットフォームのデフォルトエンコーディングを使用します。これは、実行しているコンピューターのシステム設定に依存し、一般的にそのロケールのユーザーの間で最も人気のあるエンコーディングです。

この「最良の推測」が正しくない場合、エンコードを明示的に指定する必要があります。残念ながら、FileReaderはこれを許可していません(APIの主要な監視)。代わりに、new InputStreamReader(new FileInputStream(filePath), encoding)を使用し、理想的にはファイルに関するメタデータからエンコードを取得する必要があります。

77

Java 11以降では、それを使用できます。

public FileReader(String fileName, Charset charset) throws IOException;
5
Radoslav Ivanov

Java 7+ doc の場合、これを使用できます。

BufferedReader reader = Files.newBufferedReader(path, StandardCharsets.UTF_8);

以下にすべての文字セットを示します doc

たとえば、ファイルがCP1252にある場合、これを使用します method

Charset.forName("windows-1252");

JavaおよびNIOの両方のIOエンコーディングの他の標準名は次のとおりです doc

ファイルのエンコーディングを正確に把握していない場合は、Google this のこのツールのようなサードパーティ製のライブラリを使用できます。

1
Andreas Gelever