Un modo per verificare il processo di conversione consiste nel configurare il decodificatore e il codificatore del set di caratteri per evitare errori invece di sostituire silenziosamente i caratteri errati con caratteri speciali:
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();
}
}
Nota che l'encoder di uscita è configurato per la simmetria qui, ma UTF-8
è in grado di codificare ogni carattere unicode, tuttavia, farlo in modo simmetrico ti aiuterà quando vorrai utilizzare lo stesso codice per eseguire altre conversioni.
Inoltre, tieni presente che ciò non sarà di aiuto se il file di input è in una codifica diversa, ma l'interpretazione errata dei byte porta a caratteri validi. Una cosa da considerare è se l'input codifica "windows-1252"
in realtà significava la codifica predefinita del sistema (e se è davvero la stessa). In caso di dubbio, puoi utilizzare Charset.defaultCharset()
invece di Charset.forName("windows-1252")
quando la conversione effettivamente prevista è default
→ UTF-8
.