44 votes

Algorithme de détection de codage de caractères

Je suis à la recherche d'un moyen de détecter les jeux de caractères dans les documents. J'ai lu le Mozilla jeu de caractères de détection de mise en œuvre ici:

Universel Charset De Détection

J'ai aussi trouvé une implémentation Java de ce qui est appelé jCharDet:

JCharDet

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

Toute aide serait appréciée. Je ne suis pas à la recherche pour obtenir une liste des approches existantes via Google, je ne suis pas à la recherche d'un lien vers le Joel Spolsky article juste pour clarifier : )

Mise à JOUR: j'ai fait un tas de la recherche dans ce et finit par trouver un cadre appelé cpdetector qui utilise un enfichables approche à caractère détection, voir:

CPDetector

Cette offre de NOMENCLATURE, chardet (Mozilla approche) et ASCII de détection des plugins. Il est aussi très facile d'écrire votre propre. Il y a aussi un autre cadre, qui fournit un bien meilleur personnage de détection que l'Mozilla approche/jchardet etc...

ICU4J

Il est très facile d'écrire votre propre plugin pour cpdetector qui utilise ce cadre pour fournir une mesure plus précise de codage de caractères algorithme de détection. Il fonctionne mieux que la Mozilla approche.

10voto

Jared Oberhaus Points 8877

Années nous avons eu jeu de caractères de détection pour une application de messagerie, et nous avons roulé notre propre. L'application de messagerie a été fait une application WAP, et le téléphone devrait UTF-8. Il y a eu plusieurs étapes:

Universel

On pourrait facilement détecter si le texte a été UTF-8, comme il est un motif de bits dans le top bits des octets 2/3/etc. Une fois que vous avez trouvé cette tendance s'est répétée un certain nombre de fois, vous pourriez être certain que c'était de l'UTF-8.

Si le fichier commence par un UTF-16 marque d'ordre des octets, vous pouvez probablement suppose que le reste du texte est que l'encodage. Sinon, la détection de l'UTF-16 n'est pas aussi facile que l'UTF-8, à moins que vous pouvez détecter les paires de substitution de motif: mais l'utilisation de paires de substitution est rare, ce qui ne fonctionne pas normalement. UTF-32 est similaire, sauf qu'il n'y sont pas les paires de substitution à détecter.

Régional de détection

Ensuite nous supposons que le lecteur a été dans une certaine région. Par exemple, si l'utilisateur a été de voir l'INTERFACE utilisateur localisée en Japonais, on pourrait alors tenter de détecter des trois principaux encodage Japonais. ISO-2022-JP est de nouveau à l'est de détecter les séquences d'échappement. Si cela ne fonctionne pas, déterminer la différence entre EUC-JP et Shift-JIS n'est pas aussi simple. Il est plus probable qu'un utilisateur recevrait Shift-JIS texte, mais il y avait des personnages dans l'EUC-JP qui n'existait pas dans Shift-JIS, et vice-versa, de sorte que, parfois, vous pourriez obtenir un bon match.

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

Les choix de l'utilisateur

Si elles ne fournissent pas de résultats satisfaisants, l'utilisateur doit choisir manuellement un codage.

7voto

McDowell Points 62645

Ce n'est pas exactement ce que vous avez demandé, mais j'ai remarqué que le projet ICU inclut une classe CharsetDetector .

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