Ett sätt att verifiera konverteringsprocessen är att konfigurera teckenuppsättningsavkodaren och kodaren för att rädda fel i stället för att tyst ersätta de felaktiga tecknen med specialtecken:
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();
}
}
Observera att utgångskodaren är konfigurerad för symmetri här, men UTF-8
är kapabel att koda varje unicode-tecken, men om du gör det symmetriskt hjälper det när du väl vill använda samma kod för att utföra andra konverteringar.
Observera vidare att detta inte hjälper om indatafilen är i en annan kodning, men att feltolka byten leder till giltiga tecken. En sak att tänka på är om ingångskodningen "windows-1252"
betydde faktiskt systemets standardkodning (och om det verkligen är detsamma). Om du är osäker kan du använda Charset.defaultCharset()
istället för Charset.forName("windows-1252")
när den faktiskt avsedda konverteringen är default
→ UTF-8
.