Question

Mon programme doit lire les fichiers qui utilisent différents encodages. Ils peuvent être ANSI, UTF-8 ou UTF-16 (grand ou petit-boutiste).

Lorsque la nomenclature (Byte Order Mark) est là, je n'ai aucun problème. Je sais que si le fichier est UTF-8 ou UTF-16 ou BE LE.

Je voulais prendre quand il n'y avait pas de nomenclature que le fichier était ANSI. Mais j'ai trouvé que les fichiers que je traite sont souvent absents de leur nomenclature. Par conséquent, aucune nomenclature peut signifier que le fichier est ANSI, UTF-8, UTF-16 ou LE BE.

Lorsque le fichier n'a pas de nomenclature, quelle serait la meilleure façon de balayer une partie du fichier et plus deviner avec précision le type de codage? Je voudrais être juste près de 100% du temps si le fichier est ANSI et dans le plus haut de 90 si elle est un format UTF.

Je suis à la recherche d'un moyen générique algorithmiques pour le déterminer. Mais je l'utilise en fait Delphi 2009, qui sait Unicode et a une classe TEncoding, donc quelque chose de spécifique à ce serait un bonus.


Réponse:

La réponse de ShreevatsaR m'a conduit à une recherche sur Google pour « détecteur de codage universel delphi » qui m'a surpris d'avoir ce poste repris à la position # 1 après avoir été en vie pour seulement environ 45 minutes! C'est googlebotting rapide !! Et aussi étonnant que Stackoverflow pénètre dans la 1ère place si rapidement.

La 2ème entrée dans Google était une entrée de blog par Fred Eaker sur détection de codage que les algorithmes énumérés dans les différentes langues.

Je trouve la mention de Delphes sur cette page, et il m'a conduit directement à le libre OpenSource ChsDet Charset Détecteur à SourceForge écrit en Delphi et basé sur la composante i18n de Mozilla.

Fantastique! Merci à tous ceux qui ont répondu (tout +1), je vous remercie ShreevatsaR, et merci encore Stackoverflow, pour me aider à trouver ma réponse en moins d'une heure!

Était-ce utile?

La solution

Peut-être que vous pouvez débourser un script Python qui utilise Chardet: encodage universel Détecteur . Il est une ré-implémentation du caractère de détection de codage utilisé par Firefox, et est utilisé par de nombreuses applications différentes . Liens utiles: code Mozilla , brève explication , explication détaillée .

Autres conseils

Voici comment le bloc-notes fait que

Il y a aussi la python universel encodage détecteur que vous pouvez vérifier.

Je suppose:

  • Tout d'abord, vérifier si le fichier a des valeurs d'octets inférieur à 32 (à l'exception de l'onglet / sauts de ligne). Dans le cas contraire, il ne peut pas être ANSI ou UTF-8. Ainsi - UTF-16. Suffit de trouver le boutisme. Pour cela, vous devriez probablement utiliser une table des codes de caractères Unicode valides. Si vous rencontrez des codes invalides, essayez l'autre boutisme si cela correspond. Si l'ajustement (ou pas), vérifier que l'on a plus grand pourcentage de codes alphanumériques. Aussi, vous pouvez essayer searchung pour les sauts de ligne et déterminer boutisme d'eux. A part cela, je n'ai pas des idées comment vérifier boutisme.
  • Si le fichier ne contient aucune valeur inférieure à 32 (en dehors dudit espace), il est probablement ANSI ou UTF-8. Essayez l'analyse syntaxique comme UTF-8 et voir si vous obtenez des caractères Unicode non valides. Si vous le faites, il est probablement ANSI.
  • Si vous attendez documents encodages non-anglais octet ou multi-octets non-Unicode, alors vous êtes hors de la chance. La meilleure chose que vous pouvez faire est quelque chose comme Internet Explorer qui fait un histogramme des valeurs de caractère et il se compare à histogrammes des langues connues. Il fonctionne assez souvent, mais échoue parfois trop. Et vous devez avoir une grande bibliothèque de lettres pour histogrammes de toutes les langues.
ASCII

? Non OS moderne utilise plus ASCII. Ils utilisent tous les codes de 8 bits, au moins, ce qui signifie qu'il est soit UTF-8, ISOLatinX, WinLatinX, MacRoman, Shift-JIS ou tout autre chose est là-bas.

Le seul test que je connaisse est de vérifier UTF-8 caractères non valides. Si vous trouvez, alors vous savez qu'il ne peut pas être UTF-8. Il en est probablement possible pour UTF-16. Mais quand il n'y a pas de jeu Unicode, il sera difficile de dire quelle page de code Windows, il est peut-être.

La plupart des éditeurs que je connais régler ce problème en permettant à l'utilisateur de choisir une valeur par défaut de la liste de tous les encodages possibles.

Il y a un code là pour contrôler la validité des caractères UTF.

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