2009-04-21 7 views
43

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

Universal Charset Detection

J'ai aussi trouvé une implémentation Java de cette appelé jCharDet:

JCharDet

Ces deux sont basées sur recherche effectuée en utilisant un ensemble de données statiques. Ce que je me demande, c'est si quelqu'un a utilisé une autre implémentation avec succès et si oui, quoi? 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 suis pas à la recherche d'une liste d'approches existantes via Google, et je ne suis à la recherche d'un lien vers l'article Joel Spolsky - juste pour préciser:)

MISE À JOUR: Je l'ai fait un tas de recherches sur cette question et a fini jusqu'à trouver un cadre appelé cpdetector qui utilise une approche connectable à la détection de caractères, voir:

CPDetector

Cette offre BOM, chardet (approche Mozilla) et plug-ins de détection ASCII. C'est aussi très facile d'écrire le vôtre. Il y a aussi un autre cadre, qui offre un bien meilleur détection de caractère que l'approche Mozilla/jchardet etc ...

ICU4J

Il est assez facile d'écrire votre propre plug-in pour cpdetector qui utilise ce cadre pour fournir un caractère plus précis algorithme de détection d'encodage. Cela fonctionne mieux que l'approche de Mozilla.

+0

C'est un problème difficile. Merci pour les bons liens de votre propre recherche. – erickson

+0

Il y a un cas célèbre de ceci: http://blogs.msdn.com/oldnewthing/archive/2007/04/17/2158334.aspx – McDowell

+0

Yep, été sur le problème de bloc-notes, je réviserai mon poste avec ma recherche une fois que j'ai terminé et terminé, quelques trucs intéressants ... – Jon

Répondre

9

Il y a quelques années, nous avions une détection de jeu de caractères pour une application de messagerie, et nous avons roulé la nôtre. L'application de messagerie était en fait une application WAP, et le téléphone attendait UTF-8. Il y avait plusieurs étapes:

Universal

On pourrait facilement détecter si le texte était UTF-8, car il y a un motif binaire spécifique dans les bits supérieurs d'octets 2/3/etc. Une fois que vous avez trouvé ce motif répété un certain nombre de fois, vous pouviez être certain que c'é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 correspond à cet encodage. Sinon, la détection de UTF-16 n'est pas aussi facile que celle de UTF-8, sauf si vous pouvez détecter le modèle de paires de substitution: mais l'utilisation de paires de substitution est rare, ce qui ne fonctionne généralement pas. UTF-32 est similaire, sauf qu'il n'y a pas de paire de substitution à détecter.

détection régionale

Ensuite, nous supposons que le lecteur était dans une certaine région. Par exemple, si l'utilisateur voyait l'interface utilisateur localisée en japonais, nous pourrions alors tenter la détection des trois principaux codages japonais. ISO-2022-JP est encore à détecter avec les séquences d'échappement. Si cela échoue, la détermination de la différence entre EUC-JP et Shift-JIS n'est pas aussi simple. Il est plus probable qu'un utilisateur reçoive du texte Shift-JIS, mais il y avait des caractères dans EUC-JP qui n'existaient pas dans Shift-JIS, et vice-versa, donc parfois vous pourriez obtenir une bonne correspondance.

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 ne donnent des résultats satisfaisants, l'utilisateur doit choisir manuellement un codage.

+0

Je suppose que les systèmes auxquels vous faites référence Dans les liens utilisent des stratégies similaires à celles que j'ai décrites, mais espérons partager notre expérience sera utile. –

+3

UTF-32 est très facile à détecter, en raison de la restriction sur la plage de points de code. Une unité de code UTF-32 valide correspondra toujours au motif 00 {0x | 10} xx xx (pour BE) ou xx xx {0x | 10} 00 (pour LE). – dan04

+0

@JaredOberhaus pourriez-vous s'il vous plaît montrer du code java sur la première étape? aussi, comment trouveriez-vous les éléments du bon groupe de codages pour la deuxième étape? –

Questions connexes