Comment détecter l'encodage d'un fichier?

115

Sur mon système de fichiers (Windows 7), j'ai des fichiers texte (ce sont des fichiers de script SQL, si cela compte).

Lorsqu’il est ouvert avec Notepad ++ , dans le menu "Encodage", il est signalé que certains d’entre eux possèdent un encodage de "UCS-2 Little Endian" et d’autres de "UTF-8 sans BOM".

Quelle est la différence ici? Ils semblent tous être des scripts parfaitement valides. Comment savoir quels sont les encodages du fichier sans Notepad ++?

Marcel
la source
7
Il existe un moyen simple d'utiliser Firefox. Ouvrez votre fichier avec Firefox, puis Afficher> Codage de caractères. Détaillé ici .
Catherine Gasnier
utiliser des heuristiques. caisse encaet chardetpour les systèmes POSIX.
Janus Troelsen
3
Je pense qu'une réponse alternative est TRIAL et ERROR. iconven particulier est utile à cet effet. Essentiellement, vous parcourez les chaînes / caractères de caractères corrompus à travers différents codages pour voir celui qui fonctionne. Vous gagnez, quand les personnages ne sont plus corrompus. J'aimerais répondre ici, avec un exemple de programmation. Mais c'est malheureusement une question protégée.
Brandon Bertelsen
FF utilise les détecteurs Mozilla Charset . Une autre méthode simple consiste à ouvrir le fichier avec MS Word. Les fichiers
seront devinés
Si chardetou chardetectn'est pas disponible sur votre système, vous pouvez installer le paquet via votre gestionnaire de paquets (par exemple apt search chardet- sous Ubuntu / debian, le paquet est généralement appelé python-chardetou python3-chardet) ou via pip avec pip install chardet(ou pip install cchardetpour la version plus rapide de c-optimisée).
ccpizza

Réponses:

97

Les fichiers indiquent généralement leur codage avec un en-tête de fichier. Il y a beaucoup d'exemples ici . Cependant, même en lisant l'en-tête, vous ne pouvez jamais être sûr du codage utilisé par un fichier .

Par exemple, un fichier contenant les trois premiers octets 0xEF,0xBB,0xBFest probablement un fichier codé UTF-8. Cependant, il peut s'agir d'un fichier ISO-8859-1 qui commence par les caractères . Ou ce pourrait être un type de fichier totalement différent.

Notepad ++ fait de son mieux pour deviner quel encodage utilise un fichier, et la plupart du temps, cela fonctionne correctement. Cependant, il arrive parfois qu'il se trompe - c'est pourquoi ce menu "Encodage" est là, vous pouvez donc remplacer sa meilleure estimation.

Pour les deux encodages que vous mentionnez:

  • Les fichiers "UCS-2 Little Endian" sont des fichiers UTF-16 (d'après ce que je comprends de l'information ci- dessous ), donc commencez probablement par 0xFF,0xFEles 2 premiers octets. D'après ce que je peux dire, Notepad ++ les décrit comme "UCS-2" car il ne supporte pas certaines facettes de UTF-16.
  • Les fichiers "UTF-8 sans nomenclature" n'ont pas d'octet d'en-tête. C'est ce que le bit "sans nomenclature" signifie.
vaughandroid
la source
3
BOM
Jan Doggen
2
Pourquoi un fichier commençant par une nomenclature est-il automatiquement détecté comme "UTF-8 sans nomenclature"?
Michael Borgwardt
2
Et si un fichier a commencé avec 0xFF, 0xFE, il devrait être détecté automatiquement comme UTF-16, pas UCS-2. UCS-2 est probablement deviné, car il contient principalement des caractères ASCII. Tous les autres octets sont donc nuls.
Michael Borgwardt
2
Avec l'expérience, hélas, les métadonnées («en-têtes») peuvent également être fausses. La base de données contenant les informations peut être corrompue ou le programme de téléchargement d'origine s'est peut-être trompé. (Cela a été un problème important pour nous au cours des derniers mois; certaines données ont été téléchargées sous le nom «UTF-8», sauf qu'il s'agissait «vraiment de la norme ISO8859-1, car elles sont vraiment les mêmes?!» Bah! Les scientifiques devraient être conservés loin de l'origination des métadonnées, ils se trompent juste…)
Donal Fellows
1
En fait, je trouve "drôle" que le problème d'encodage persiste en 2014, car aucun fichier dans le monde ne commence par "ï» ¿"et je suis très surpris de voir une page HTML chargée avec un encodage incorrect. C'est une question de probabilité. Il est impensable de choisir le mauvais encodage si un autre encodage évite les caractères étranges. Chercher un encodage qui évite les caractères étranges fonctionnerait dans 99,9999% des cas, je suppose. Mais il y a toujours des erreurs .. C'est aussi un message très déroutant d'utiliser ascii au lieu de UTF8 pour gagner de la place .. cela
déroute les
18

Vous ne pouvez pas. Si vous pouviez le faire, il n’y aurait pas autant de sites Web ou de fichiers texte contenant du «charabia aléatoire». C'est pourquoi l'encodage est généralement envoyé avec la charge utile sous forme de métadonnées.

Dans le cas contraire, tout ce que vous pouvez faire est une «proposition intelligente», mais le résultat est souvent ambigu, car la même séquence d'octets peut être valide dans plusieurs codages.

Marco
la source
2
OK, le système d’exploitation Windows stocke-t-il réellement ces informations (métadonnées) quelque part? Dans le registre probablement?
Marcel
Vous vous trompez. Ce sont des pages de code - pas tout à fait les mêmes. Il existe des algorithmes à deviner pour le codage Unicode.
DeadMG
6
@Marcel: Non. C'est pourquoi les "fichiers texte" sont si problématiques pour tout sauf le pur ASCII.
Michael Borgwardt
bien notepad ++ peut le faire, il peut vous dire si le fichier texte est utf-8 codé ou non
user25