Une façon de vérifier le processus de conversion consiste à configurer le décodeur et l'encodeur du jeu de caractères pour se prémunir contre les erreurs au lieu de remplacer silencieusement les caractères erronés par des caractères spéciaux :
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();
}
}
Notez que l'encodeur de sortie est configuré pour la symétrie ici, mais UTF-8
est capable d'encoder chaque caractère unicode, cependant, le faire de manière symétrique vous aidera une fois que vous voudrez utiliser le même code pour effectuer d'autres conversions.
De plus, notez que cela n'aidera pas si le fichier d'entrée est dans un encodage différent, mais une mauvaise interprétation des octets conduit à des caractères valides. Une chose à considérer est de savoir si le codage d'entrée "windows-1252"
signifiait en fait l'encodage par défaut du système (et si c'est vraiment le même). En cas de doute, vous pouvez utiliser Charset.defaultCharset()
au lieu de Charset.forName("windows-1252")
lorsque la conversion réellement prévue est default
→ UTF-8
.