Bonjour,
J'ai une chaine stockée en base de données qui correspond à des adresses et qui n'est censé contenir que des caractères ANSI. Or, cela n'est pas toujours le cas (les données sont incorrecte alors).
Exemple: '13 rue de lavion' en base de données
J'écris dans un fichier de sortie en StandardCharsets.ISO_8859_1. Quand j'ouvre ce fichier dans Notepad++, une telle adresse s'affiche avec un caractère bizarre (comme 'CAN' par exemple au lieu du carré) et le fichier produit ne peut pas être exploité. Le caractère ne semble donc pas reconnu en ANSI.
Ma question est: Au moment où je récupère en base la chaine de caractère dans un String, est-ce qu'il y a un moyen de vérifier si tout les caractères correspondent à un caractère correspondant au charset ISO_8859_1 afin de partir un erreur si ce n'est pas le cas? (en gros je voudrais que pour la chaine citée en exemple, je parte en erreur car identifiée comme incorrecte à cause du caractère spécial).
Le but est d'identifier ces cas avec une adresse incorrecte quand c'est traité afin de pouvoir remonter ces anomalies à l'équipe en charge de remplir la base de données.
Je ne sais pas si je dois utiliser String.getBytes(Charset charset) car je vois qu'il est mis "This method always replaces malformed-input and unmappable-character sequences with this charset's default replacement byte array". Cela voudrait dire que je peux identifier un caractère mal formé ou inexistant en cherchant ce byte de remplacement par défaut?
Ou la méthode CharsetEncoder.canEncode() (je ne sais pas si ca retournerait false dans mon cas)?
Merci d'avance pour votre retour.
SOLUTION
Edit: voici la solution mise en place et qui semble fonctionner.
En regardant mes fichiers j'ai vu que les caractères qui posent problème sont en fait des caractères de controle (non imprimable comme 'CAN', 'SO', 'STX'...).
Je fais donc 2 checks:
une méthode pour tester si c'est un caractère de controle
Ainsi qu'un check en fonction de l'encodeur:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 /** * Return true if character is a control character according to unicode (not printable character) * @param pCharacter * @return */ private boolean isControlCharacter(char character) { return character <= '\u001F'; }
La combinaison de ces 2 méthodes me permet d'identifier les lignes qui posent problème .
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 CharsetEncoder encoder = Charset.forName("ISO-8859-1").newEncoder(); encoder.canEncode(stringToCheck.charAt(index));
Voici des liens utiles avec les tables pour l'ISO 8859-1 et les codes unicodes des caractères:
http://www.dg77.net/tekno/xhtml/ascii.htm
https://www.utf8-chartable.de/unicod...codeinhtml=dec
Partager