En måde at verificere konverteringsprocessen på er at konfigurere tegnsæt-dekoderen og -koderen til at redde ud for fejl i stedet for lydløst at erstatte de fejlagtige tegn med specialtegn:
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();
}
}
Bemærk, at output-encoderen er konfigureret til symmetri her, men UTF-8
er i stand til at kode hvert unicode-tegn, men at gøre det symmetrisk vil hjælpe, når du vil bruge den samme kode til at udføre andre konverteringer.
Bemærk endvidere, at dette ikke hjælper, hvis inputfilen er i en anden kodning, men fejlfortolkning af bytes fører til gyldige tegn. En ting at overveje er, om input-kodningen "windows-1252"
mente faktisk systemets standardkodning (og om det virkelig er det samme). Hvis du er i tvivl, kan du bruge Charset.defaultCharset()
i stedet for Charset.forName("windows-1252")
når den faktisk tilsigtede konvertering er default
→ UTF-8
.