Một cách để xác minh quá trình chuyển đổi là định cấu hình bộ mã hóa và giải mã bộ ký tự để khắc phục lỗi thay vì âm thầm thay thế các ký tự bị lỗi bằng các ký tự đặc biệt:
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();
}
}
Lưu ý rằng bộ mã hóa đầu ra được định cấu hình cho đối xứng ở đây, nhưng UTF-8
có khả năng mã hóa mọi ký tự unicode, tuy nhiên, làm điều đó đối xứng sẽ hữu ích khi bạn muốn sử dụng cùng một mã để thực hiện các chuyển đổi khác.
Ngoài ra, hãy lưu ý rằng điều này sẽ không hữu ích nếu tệp đầu vào ở một mã hóa khác nhưng việc diễn giải sai các byte dẫn đến các ký tự hợp lệ. Một điều cần xem xét là liệu mã hóa đầu vào "windows-1252"
thực sự có nghĩa là mã hóa mặc định của hệ thống (và liệu điều đó có thực sự giống nhau hay không). Nếu nghi ngờ, bạn có thể sử dụng Charset.defaultCharset()
thay vì Charset.forName("windows-1252")
khi chuyển đổi thực sự dự định là default
→ UTF-8
.