web-dev-qa-db-fra.com

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

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

Lorsqu'il est ouvert avec Notepad ++ , dans le menu "Encodage", certains d'entre eux auraient un encodage "UCS-2 Little Endian" et certains "UTF-8 sans BOM".

Quelle est la différence ici? Ils semblent tous être des scripts parfaitement valides. Comment pourrais-je savoir quels encodages le fichier a sans Notepad ++?

127
Marcel

Les fichiers indiquent généralement leur encodage avec un en-tête de fichier. Il existe de nombreux exemples ici . Cependant, même en lisant l'en-tête , vous ne pouvez jamais être sûr de ce que l'encodage d'un fichier utilise réellement .

Par exemple, un fichier contenant les trois premiers octets 0xEF,0xBB,0xBF est probablement un fichier encodé UTF-8. Cependant, il peut s'agir d'un fichier ISO-8859-1 qui commence par commencer par les caractères . Ou il peut s'agir d'un type de fichier entièrement différent.

Notepad ++ fait de son mieux pour deviner quel encodage un fichier utilise, et la plupart du temps il le fait correctement. Parfois, il se trompe cependant - c'est pourquoi ce menu `` Encodage '' est là, donc vous pouvez remplacer sa meilleure estimation.

Pour les deux encodages que vous mentionnez:

  • Les fichiers "UCS-2 Little Endian" sont des fichiers UTF-16 (basés sur ce que je comprends des informations ici ) donc probablement commencez par 0xFF,0xFE comme les 2 premiers octets. D'après ce que je peux dire, Notepad ++ les décrit comme "UCS-2" car il ne prend pas en charge certaines facettes de l'UTF-16.
  • Les fichiers "UTF-8 sans BOM" n'ont pas d'octets d'en-tête. C'est ce que signifie le bit "sans nomenclature".
107
vaughandroid

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 en tant que métadonnées.

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

19
Marco