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を使用している場合、自分で文字エンコードを設定する必要がないということですか?しかし、私は現在間違ったエンコードされたデータを取得しました。私の状況に対処する正しい方法は何ですか?ありがとう。
はい、あなたは読み取りたいファイルのエンコーディングを指定する必要があります。
はい、これはknow読みたいファイルのエンコーディングをしなければならないことを意味します。
いいえ、guessに与えられた「プレーンテキスト」ファイルのエンコーディングの一般的な方法はありません。
FileReader
のコンストラクターは、常にプラットフォームのデフォルトエンコーディングを常に使用します。これは、一般的に悪い考えです。
FileReaderの代わりに、 new InputStreamReader(
new FileInputStream(pathToFile)
, <encoding>)
を使用する必要があります。
FileReader
はJavaのプラットフォームのデフォルトエンコーディングを使用します。これは、実行しているコンピューターのシステム設定に依存し、一般的にそのロケールのユーザーの間で最も人気のあるエンコーディングです。
この「最良の推測」が正しくない場合、エンコードを明示的に指定する必要があります。残念ながら、FileReader
はこれを許可していません(APIの主要な監視)。代わりに、new InputStreamReader(new FileInputStream(filePath), encoding)
を使用し、理想的にはファイルに関するメタデータからエンコードを取得する必要があります。
Java 11以降では、それを使用できます。
public FileReader(String fileName, Charset charset) throws IOException;
Java 7+ doc の場合、これを使用できます。
BufferedReader reader = Files.newBufferedReader(path, StandardCharsets.UTF_8);
以下にすべての文字セットを示します doc
たとえば、ファイルがCP1252にある場合、これを使用します method
Charset.forName("windows-1252");
JavaおよびNIOの両方のIOエンコーディングの他の標準名は次のとおりです doc
ファイルのエンコーディングを正確に把握していない場合は、Google this のこのツールのようなサードパーティ製のライブラリを使用できます。