76 votes

Validation UTF-8

Je suis du traitement de certains fichiers de données qui sont censés être UTF-8 valide, mais ne le sont pas, ce qui provoque l'analyseur (pas sous mon contrôle) à l'échec. Je voudrais ajouter une étape de pré-validation des données pour l'UTF-8-formation, mais je n'ai pas encore trouvé un utilitaire pour aider à faire cela. Il y a un service web par le W3C qui semble être mort, et j'ai trouvé un Windows uniquement la validation de l'outil de que les rapports non valide les fichiers UTF-8 mais n'a pas de rapport, des lignes/caractères à corriger. Je serais heureux avec un outil que je peux déposer et de les utiliser (dans l'idéal de la croix-plate-forme), ou un ruby/perl script je peux faire partie de mes données, processus de chargement.

Toutes les suggestions?

Ian

103voto

Torsten Marek Points 27554

Vous pouvez utiliser GNU iconv:

 $ iconv -f UTF-8 your_file -o /dev/null
 

iconv retournera 0 si le fichier peut ê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 : Le codage de sortie n'a pas besoin d'être spécifié, il sera supposé être UTF-8.

9voto

tzot Points 32224

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

5voto

AShelly Points 17389

Comment au sujet de la gnu iconv bibliothèque? À l'aide de la fonction iconv (): "Une défaillance de la séquence multi-octets est rencontré dans l'entrée. Dans ce cas, il positionne errno à EILSEQ et renvoie (size_t)(-1). *inbuf est à gauche pointant vers le début de la séquence de la séquence."

EDIT: oh j'ai raté la partie où vous voulez un langage de script. Mais pour la ligne de commande de travail, la fonction iconv utilitaire doit valider pour vous aussi.

-3voto

izogfif Points 79

Le code C ++ ci-dessous est basé sur celui posté sur de nombreux sites sur Internet. J'ai corrigé l'erreur dans le code d'origine et ajouté la possibilité de récupérer à la fois la position du caractère non valide et le caractère non valide lui-même.

 ///Returns -1 if string is valid. Invalid character is put to ch.
int getInvalidUtf8SymbolPosition(const unsigned char *input, unsigned char &ch) {
  int                 nb, na;
  const unsigned char *c = input;

  for (c = input;  *c;  c += (nb + 1)) {
    if (!(*c & 0x80))
        nb = 0;
    else if ((*c & 0xc0) == 0x80)
    {
        ch = *c;
        return (int)c - (int)input;
    }
    else if ((*c & 0xe0) == 0xc0)
        nb = 1;
    else if ((*c & 0xf0) == 0xe0)
        nb = 2;
    else if ((*c & 0xf8) == 0xf0)
        nb = 3;
    else if ((*c & 0xfc) == 0xf8)
        nb = 4;
    else if ((*c & 0xfe) == 0xfc)
        nb = 5;
    na = nb;
    while (na-- > 0)
      if ((*(c + nb) & 0xc0) != 0x80)
      {
          ch = *(c + nb);
          return (int)(c + nb) - (int)input;
      }
  } 

  return -1;
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X