Question

Je traite certains fichiers de données supposés être valides au format UTF-8 mais ne le sont pas, ce qui entraîne l'échec de l'analyseur (pas sous mon contrôle). J'aimerais ajouter une étape de pré-validation des données pour le formatage UTF-8, mais je n'ai pas encore trouvé d'utilitaire permettant de le faire.

Il existe un service Web au W3C, qui semble être mort, et j'ai trouvé une validation Windows uniquement outil qui signale les fichiers UTF-8 non valides mais ne signale pas les lignes / caractères à corriger.

Je serais satisfait de l’utilisation d’un outil que je pourrais utiliser et utiliser (idéalement sur plusieurs plates-formes), ou d’un script ruby ??/ perl que je pourrais intégrer à mon processus de chargement de données.

Était-ce utile?

La solution

Vous pouvez utiliser GNU iconv:

$ iconv -f UTF-8 your_file -o /dev/null; echo $?

Ou avec les anciennes versions de iconv, telles que sur macOS:

$ iconv -f UTF-8 your_file > /dev/null; echo $?

La commande retournera 0 si le fichier peut être converti avec succès, et 1 sinon. De plus, il imprimera le décalage d'octet où la séquence d'octets non valide s'est produite.

Modifier : le codage de sortie n'a pas à être spécifié, il sera supposé être au format UTF-8.

Autres conseils

Utilisez les fonctions python et str.encode | decode.

>>> 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 a l'information demandée 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')

Vous pouvez utiliser isutf8 à partir de collection moreutils .

$ apt-get install moreutils
$ isutf8 your_file

Dans un script shell, utilisez le commutateur - quiet et vérifiez le statut de sortie, qui est zéro pour les fichiers valides utf-8.

Qu'en est-il de la bibliothèque iconv de gnu? Utilisation de la fonction iconv (): "Une séquence multi-octets non valide est rencontrée dans l'entrée. Dans ce cas, il définit EILSEQ avec errno et renvoie (size_t) (- 1). * inbuf est laissé pointer vers le début de la séquence multi-octets non valide. "

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 validez pour vous aussi.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top