Salah satu cara untuk memverifikasi proses konversi adalah dengan mengonfigurasi dekoder charset dan encoder untuk menyelamatkan kesalahan alih-alih secara diam-diam mengganti karakter yang salah dengan karakter khusus:
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();
}
}
Perhatikan bahwa encoder keluaran dikonfigurasikan untuk simetri di sini, tetapi UTF-8
mampu mengkodekan setiap karakter unicode, namun, melakukannya secara simetris akan membantu setelah Anda ingin menggunakan kode yang sama untuk melakukan konversi lainnya.
Selanjutnya, perhatikan bahwa ini tidak akan membantu jika file input dalam penyandian yang berbeda tetapi salah menafsirkan byte mengarah ke karakter yang valid. Satu hal yang perlu dipertimbangkan adalah apakah pengkodean input "windows-1252"
sebenarnya berarti pengkodean default sistem (dan apakah itu benar-benar sama). Jika ragu, Anda dapat menggunakan Charset.defaultCharset()
bukannya Charset.forName("windows-1252")
ketika konversi yang sebenarnya dimaksudkan adalah default
→ UTF-8
.