Един от начините за проверка на процеса на преобразуване е да конфигурирате декодера и енкодера на набор от знаци, за да спасява грешки, вместо безшумно да заменяте грешните знаци със специални знаци:
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();
}
}
Имайте предвид, че изходният енкодер е конфигуриран за симетрия тук, но UTF-8
е в състояние да кодира всеки символ на Unicode, но ако го направите симетрично, това ще помогне, след като искате да използвате същия код за извършване на други преобразувания.
Освен това, имайте предвид, че това няма да помогне, ако входният файл е в различно кодиране, но погрешното тълкуване на байтовете води до валидни знаци. Едно нещо, което трябва да имате предвид, е дали входното кодиране "windows-1252"
всъщност означаваше кодирането по подразбиране на системата (и дали това наистина е същото). Ако имате съмнения, можете да използвате Charset.defaultCharset()
вместо Charset.forName("windows-1252")
когато действително планираното преобразуване е default
→ UTF-8
.