Eine Möglichkeit, den Konvertierungsprozess zu überprüfen, besteht darin, den Zeichensatz-Decoder und -Encoder so zu konfigurieren, dass Fehler behoben werden, anstatt die fehlerhaften Zeichen stillschweigend durch Sonderzeichen zu ersetzen:
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();
}
}
Beachten Sie, dass der Ausgabe-Encoder hier für Symmetrie konfiguriert ist, aber UTF-8
ist in der Lage, jedes Unicode-Zeichen zu codieren, es hilft jedoch, es symmetrisch zu machen, wenn Sie denselben Code für andere Konvertierungen verwenden möchten.
Beachten Sie außerdem, dass dies nicht hilft, wenn die Eingabedatei in einer anderen Codierung vorliegt, aber eine Fehlinterpretation der Bytes zu gültigen Zeichen führt. Zu beachten ist, ob die Eingabekodierung "windows-1252"
eigentlich die Standardcodierung des Systems gemeint (und ob das wirklich die gleiche ist). Im Zweifelsfall können Sie Charset.defaultCharset()
verwenden statt Charset.forName("windows-1252")
wenn die eigentlich beabsichtigte Konvertierung default
ist → UTF-8
.