web-dev-qa-db-fra.com

Comment savoir quel encodage est utilisé dans un fichier

J'ai eu quelques problèmes avec les fichiers de sous-titres dans vidéo omxplayer. Pour le résoudre, j'ai dû convertir l'encodage UTF-8 de Windows-1250. Ma question est, comment puis-je voir pour un fichier spécifique quel encodage est utilisé?

17
NonStandardModel

Vous ne pouvez pas vraiment savoir automatiquement si un fichier a été écrit avec le codage X à l'origine.

Cependant, vous pouvez facilement vérifier si le fichier complet peut être décodé avec succès (mais pas nécessairement correctement) à l'aide d'un codec spécifique. Si vous trouvez des octets qui ne sont pas valides pour un codage donné, ce doit être autre chose.

Le problème est que beaucoup de codecs sont similaires et ont les mêmes "modèles d'octets valides", les interprétant simplement comme des caractères différents. Par exemple, un ä dans un codage peut correspondre à é dans un autre ou à ø dans un troisième. L'ordinateur ne peut pas vraiment détecter le moyen d'interpréter les résultats des octets en un texte lisible par l'homme correctement (sauf si vous ajoutez un dictionnaire pour toutes sortes de langues et le laissez effectuer des vérifications orthographiques ...). Vous devez également savoir que certains jeux de caractères sont en réalité des sous-ensembles d'autres, comme par exemple. Le codage ASCII fait partie des codecs les plus couramment utilisés, comme certains de la famille ANSI ou UTF-8. Cela signifie par exemple qu'un texte enregistré au format UTF-8 ne contenant que des caractères latins simples, il serait identique au même fichier enregistré au format ASCII.


Cependant, revenons d’expliquer ce que vous ne pouvez pas faire à ce que vous pouvez réellement faire:

Pour effectuer une vérification de base des fichiers texte ASCII/non-ASCII (normalement UTF-8), vous pouvez utiliser la commande file. Cependant, il ne connaît pas beaucoup de codecs et examine uniquement les premiers Ko de fichier, en supposant que le reste ne contiendra aucun nouveau caractère. D’autre part, il reconnaît également d’autres types de fichiers courants tels que divers scripts, documents HTML/XML et de nombreux formats de données binaires (ce qui n’a aucun intérêt à comparer des fichiers texte) et peut imprimer des informations supplémentaires en cas de lignes extrêmement longues type de séquence de nouvelle ligne (par exemple, UNIX: LF, Windows: CR + LF) est utilisé.

$ cat ascii.txt 
I am an ASCII file.
Just text and numb3rs and simple punctuation...

$ cat utf8.txt 
I am a Unicode file.
Special characters like Ω€®Ŧ¥↑ıØÞöäüß¡!

$ file ascii.txt utf8.txt 
ascii.txt: ASCII text
utf8.txt:  UTF-8 Unicode text

Si cela ne suffit pas, je peux vous proposer le script Python pour lequel j'ai écrit cette réponse ici , qui analyse des fichiers complets et tente de les décoder à l'aide d'un jeu de caractères spécifié. S'il réussit, cet encodage est un candidat potentiel. Sinon, si certains octets ne peuvent pas être décodés, vous pouvez supprimer ce jeu de caractères de votre liste.

23
Byte Commander

Un programme nommé file peut le faire. Exemple:

$ echo aaa >> FILE
$ file FILE
FILE: ASCII text, with CRLF, LF line terminators
$ echo öäü >> FILE
$ file FILE
FILE: UTF-8 Unicode text, with CRLF, LF line terminators

Si cela vous intéresse, voir src/encoding.c.

6
Arkadiusz Drabczyk