Jednym ze sposobów weryfikacji procesu konwersji jest skonfigurowanie dekodera i kodera zestawu znaków do unikania błędów zamiast cichego zastępowania błędnych znaków znakami specjalnymi:
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();
}
}
Zauważ, że koder wyjściowy jest tutaj skonfigurowany pod kątem symetrii, ale UTF-8
jest w stanie zakodować każdy znak Unicode, jednak zrobienie tego symetrycznie pomoże, gdy będziesz chciał użyć tego samego kodu do wykonywania innych konwersji.
Co więcej, zauważ, że to nie pomoże, jeśli plik wejściowy jest w innym kodowaniu, ale błędna interpretacja bajtów prowadzi do prawidłowych znaków. Jedną z rzeczy do rozważenia jest to, czy kodowanie wejściowe "windows-1252"
w rzeczywistości oznaczało domyślne kodowanie systemu (i czy to naprawdę to samo). W razie wątpliwości możesz użyć Charset.defaultCharset()
zamiast Charset.forName("windows-1252")
kiedy faktycznie zamierzona konwersja to default
→ UTF-8
.