Je traite des fichiers de données qui sont censés être des UTF-8 valides mais qui ne le sont pas, ce qui entraîne l'échec de l'analyseur (hors de mon contrôle). Je voudrais ajouter une étape de pré-validation des données pour une bonne mise en forme UTF-8, mais je n'ai pas encore trouvé d'utilitaire pour aider à le faire.
Il y a un service Web au W3C qui semble être mort, et j'ai trouvé une validation Windows uniquement outil qui signale les fichiers UTF-8 invalides mais ne signale pas lesquels lignes/caractères à corriger.
Je serais heureux avec un outil que je peux déposer et utiliser (idéalement multiplateforme), ou un script Ruby/Perl que je peux intégrer à mon processus de chargement de données.
Vous pouvez utiliser GNU iconv:
$ iconv -f UTF-8 your_file -o /dev/null; echo $?
Ou avec des versions plus anciennes d'iconv, comme sur macOS:
$ iconv -f UTF-8 your_file > /dev/null; echo $?
La commande renverra 0 si le fichier a pu être converti avec succès et 1 sinon. En outre, il imprimera le décalage d'octet où la séquence d'octets non valide s'est produite.
Edit: L'encodage de sortie n'a pas besoin d'être spécifié, il sera supposé être UTF-8.
Utilisez python et str.encode | décoder les fonctions.
>>> a="γεια"
>>> a
'\xce\xb3\xce\xb5\xce\xb9\xce\xb1'
>>> b='\xce\xb3\xce\xb5\xce\xb9\xff\xb1' # note second-to-last char changed
>>> print b.decode("utf_8")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python2.5/encodings/utf_8.py", line 16, in decode
return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xff in position 6: unexpected code byte
L'exception levée contient les informations demandées dans sa propriété .args.
>>> try: print b.decode("utf_8")
... except UnicodeDecodeError, exc: pass
...
>>> exc
UnicodeDecodeError('utf8', '\xce\xb3\xce\xb5\xce\xb9\xff\xb1', 6, 7, 'unexpected code byte')
>>> exc.args
('utf8', '\xce\xb3\xce\xb5\xce\xb9\xff\xb1', 6, 7, 'unexpected code byte')
Que diriez-vous de la bibliothèque gnu iconv ? En utilisant la fonction iconv (): "Une séquence multi-octets invalide est rencontrée dans l'entrée. Dans ce cas, elle définit errno sur EILSEQ et retourne (size_t) (- 1). * Inbuf pointe vers le début de la séquence multi-octets invalide. "
EDIT: oh - j'ai raté la partie où vous voulez un langage de script. Mais pour le travail en ligne de commande, l'utilitaire iconv devrait également valider pour vous.