Comment puis-je voir quel encodage est utilisé dans un fichier

23

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

NonStandardModel
la source
piconvpour changer l'encodage;)
Rinzwind
Oui. J'ai déjà changé l'encodage (dans 1 fichier). Mais j'en ai beaucoup et je voulais faire un petit script qui les contrôlerait tous et les cacherait si nécessaire. Mais je suppose que je peux simplement les convertir tous. Aucun mal ne sera fait si certains sont déjà en UTF-8. Droite?
NonStandardModel
Pas de problème non :) Utilisez simplement un caractère générique
Rinzwind

Réponses:

26

Vous ne pouvez pas vraiment savoir automatiquement si un fichier a été écrit avec l'encodage 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 encodage donné, ce doit être autre chose.

Le problème est que de nombreux 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 äcodage dans un peut correspondre à éun autre ou øà un troisième. L'ordinateur ne peut pas vraiment détecter de quelle manière interpréter l'octet donne un texte correctement lisible par l'homme (sauf peut-être 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 fait 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 un texte enregistré en UTF-8 qui ne contient que des caractères latins simples, il serait identique au même fichier enregistré en ASCII.


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

Pour une vérification de base des fichiers texte ASCII / non ASCII (normalement UTF-8), vous pouvez utiliser la filecommande. Cependant, il ne connaît pas beaucoup de codecs et il n'examine que les premiers Ko d'un fichier, en supposant que le reste ne contiendra pas de nouveaux caractères. D'un autre côté, il reconnaît également d'autres types de fichiers courants comme divers scripts, des documents HTML / XML et de nombreux formats de données binaires (ce qui n'est cependant pas intéressant pour comparer des fichiers texte) et il peut imprimer des informations supplémentaires s'il y a des lignes extrêmement longues ou quoi le 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 ici le script Python que j'ai écrit pour cette réponse , qui scanne les fichiers complets et essaie de les décoder en utilisant un jeu de caractères spécifié. S'il réussit, ce codage est un candidat potentiel. Sinon, s'il y a des octets qui ne peuvent pas être décodés avec, vous pouvez supprimer ce jeu de caractères de votre liste.

Byte Commander
la source
ANSI n'est pas vraiment le nom d'un codage de caractères. Vous pensez peut-être aux codes d'échappement ANSI, qui peuvent être exprimés avec le codage de caractères ASCII.
kasperd
@kasperd Il fait probablement référence à l'une des familles de pages de codes ISO 8859 ou Windows. Pour les développeurs de fenêtres nord-américaines, le codage ANSI signifie souvent le codage Windows 1252 pour des raisons historiques.
user1937198
Oui, eh bien, ANSI est essentiellement ASCII (codes 0-127) plus une page de code spécifique aux paramètres régionaux (codes 128-255). Vous avez donc raison ...
Byte Commander
Plus d'informations: Qu'est-ce que le format ANSI?
wjandrea
12

Un programme nommé filepeut 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 vous êtes intéressé par la façon dont cela se fait, voyez src/encoding.c.

Arkadiusz Drabczyk
la source
2
Ça peut deviner de toute façon.
Hobbs du
2
filefait une supposition, et souvent ce n'est pas très bon. Par exemple, lors de mes tests, MacRoman et CP-1252 ont été mal identifiés comme ISO-8859, avec pour résultat que "š" et "ß" ont été brouillés.
Mark
Super 👌! J'ai passé quelques heures à trouver l'encodage correct de mon ancien .sqlfichier et filej'ai montré qu'il s'agissait bien d'un gzipfichier compressé!
Amirreza Nasiri