Jedním ze způsobů, jak ověřit proces převodu, je nakonfigurovat dekodér a kodér znakové sady tak, aby chránil před chybami namísto tichého nahrazování chybných znaků speciálními znaky:
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();
}
}
Všimněte si, že výstupní kodér je zde nakonfigurován pro symetrii, ale UTF-8
je schopen zakódovat každý znak Unicode, ale když to uděláte symetricky, pomůže vám to, když budete chtít použít stejný kód pro provádění dalších převodů.
Dále mějte na paměti, že to nepomůže, pokud je vstupní soubor v jiném kódování, ale nesprávná interpretace bajtů vede k platným znakům. Jedna věc, kterou je třeba zvážit, je, zda vstupní kódování "windows-1252"
ve skutečnosti znamenalo výchozí kódování systému (a zda je to skutečně stejné). V případě pochybností můžete použít Charset.defaultCharset()
místo Charset.forName("windows-1252")
když je skutečně zamýšlená konverze default
→ UTF-8
.