変換プロセスを検証する1つの方法は、エラーのある文字を特殊文字に黙って置き換えるのではなく、エラーを回避するように文字セットデコーダーとエンコーダーを構成することです。
CharsetDecoder inDec=Charset.forName("windows-1252").newDecoder()
.onMalformedInput(CodingErrorAction.REPORT)
.onUnmappableCharacter(CodingErrorAction.REPORT);
CharsetEncoder outEnc=StandardCharsets.UTF_8.newEncoder()
.onMalformedInput(CodingErrorAction.REPORT)
.onUnmappableCharacter(CodingErrorAction.REPORT);
try(FileInputStream is=new FileInputStream(filepath);
BufferedReader reader=new BufferedReader(new InputStreamReader(is, inDec));
FileOutputStream fw=new FileOutputStream(destpath);
BufferedWriter out=new BufferedWriter(new OutputStreamWriter(fw, outEnc))) {
for(String in; (in = reader.readLine()) != null; ) {
out.write(in);
out.newLine();
}
}
ここでは、出力エンコーダーが対称になるように構成されていますが、UTF-8
はすべてのUnicode文字をエンコードできますが、他の変換を実行するために同じコードを使用する場合は、対称にすることで役立ちます。
さらに、入力ファイルが別のエンコーディングである場合、これは役に立ちませんが、バイトを誤って解釈すると有効な文字になることに注意してください。考慮すべきことの1つは、入力エンコーディングが"windows-1252"
かどうかです。 実際には、システムのデフォルトのエンコーディングを意味していました(そしてそれが本当に同じかどうか)。疑わしい場合は、Charset.defaultCharset()
を使用できます。 Charset.forName("windows-1252")
の代わりに 実際に意図された変換がdefault
の場合 →UTF-8
。