Uma maneira de verificar o processo de conversão é configurar o decodificador e o codificador do conjunto de caracteres para evitar erros em vez de substituir silenciosamente os caracteres errados por caracteres especiais:
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();
}
}
Observe que o codificador de saída está configurado para simetria aqui, mas
UTF-8
é capaz de codificar todos os caracteres unicode, no entanto, fazê-lo simétrico ajudará quando você quiser usar o mesmo código para realizar outras conversões. Além disso, observe que isso não ajudará se o arquivo de entrada estiver em uma codificação diferente, mas a interpretação incorreta dos bytes leva a caracteres válidos. Uma coisa a considerar é se a codificação de entrada
"windows-1252"
na verdade significava a codificação padrão do sistema (e se isso é realmente o mesmo). Em caso de dúvida, você pode usar Charset.defaultCharset()
em vez de Charset.forName("windows-1252")
quando a conversão realmente pretendida é default
→ UTF-8
.