web-dev-qa-db-fra.com

Algorithme de détection de codage de caractères

Je cherche un moyen de détecter des ensembles de caractères dans les documents. J'ai lu la mise en œuvre de la détection du jeu de caractères Mozilla ici:

Détection universelle de charset

J'ai aussi trouvé un Java implémentation de cet appelé JCHAdet:

jchanea

Les deux sont basés sur des recherches effectuées à l'aide d'un ensemble de données statiques. Ce que je me demande, c'est si quelqu'un a utilisé toute autre mise en œuvre avec succès et si oui? Avez-vous roulé votre propre approche et si oui, quel était l'algorithme que vous avez utilisé pour détecter le jeu de caractères?

Toute aide serait appréciée. Je ne cherche pas une liste d'approches existantes via Google, ni je cherche un lien vers l'article Joel Spolsky - juste pour clarifier :)

Mise à jour: J'ai fait un tas de recherches sur cette question et j'ai fini par trouver un cadre appelé CPDetector qui utilise une approche pluggable de la détection des caractères, voir:

CPDEtector

Ceci fournit BOM, Chardet (Approche Mozilla) et ASCII Plugins de détection. Il est également très facile d'écrire le vôtre. Il existe également un autre cadre qui offre une plus grande détection de caractère que l'approche Mozilla/JCHARTET, etc. ...

ICU4J

Il est assez facile d'écrire votre propre plugin pour le CPDetector qui utilise ce cadre pour fournir un algorithme de détection de codage de caractères plus précis. Cela fonctionne mieux que l'approche Mozilla.

44
Jon

Il y a des années, nous avons eu une détection de personnage pour une application de courrier et nous avons roulé le nôtre. L'application Mail était en réalité une application WAP et le téléphone attendu UTF-8. Il y avait plusieurs étapes:

niversel

Nous pourrions facilement détecter si le texte était UTF-8, car il existe un motif de bits spécifique dans les bits supérieurs d'octets 2/3/etc. Une fois que vous avez constaté que le modèle a répété un certain nombre de fois que vous pourriez être certain, il était UTF-8.

Si le fichier commence par une marque d'ordre d'octets UTF-16, vous pouvez probablement supposer que le reste du texte est celui de codage. Sinon, la détection de UTF-16 n'est pas aussi simple que UTF-8, à moins que vous ne puissiez détecter le motif de paires de substitution: mais l'utilisation de paires de substitution est rare, de sorte que cela ne fonctionne généralement pas. UTF-32 est similaire, sauf qu'il n'y a pas de paires de substitution à détecter.

Détection régionale

Ensuite, nous supposerions que le lecteur était dans une certaine région. Par exemple, si l'utilisateur constate l'interface utilisateur localisée en japonais, nous pourrions alors tenter la détection des trois principaux codages japonais. ISO-2022-JP est à nouveau à l'est de détecter avec les séquences d'échappement. Si cela échoue, la détermination de la différence entre l'EUC-JP et le shift-JIS n'est pas aussi simple. Il est plus probable qu'un utilisateur recevrait un texte de changement de vitesse, mais il y avait des personnages dans l'EUC-JP qui n'existaient pas dans Shift-JIS, et vice-versa, donc parfois vous pourriez avoir un bon match.

La même procédure a été utilisée pour les codages chinois et d'autres régions.

Choix de l'utilisateur

Si ceux-ci n'ont pas fourni de résultats satisfaisants, l'utilisateur doit choisir manuellement un codage.

10
Jared Oberhaus

Pas exactement ce que vous avez demandé, mais j'ai remarqué que le Projet IC inclut une catégorie CHSetDetector .

7
McDowell