web-dev-qa-db-fra.com

Comment vérifier si un fichier est UTF-8 valide?

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.

63
Ian Dickinson

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.

85
Torsten Marek

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')
9
tzot

Vous pouvez utiliser isutf8 de la collection moreutils .

$ apt-get install moreutils
$ isutf8 your_file

Dans un script Shell, utilisez le --quiet basculez et vérifiez l'état de sortie, qui est zéro pour les fichiers valides utf-8.

9
Roger Dahl

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.

4
AShelly