web-dev-qa-db-fra.com

Comment puis-je être sûr de l'encodage du fichier?

J'ai un fichier PHP que j'ai créé avec VIM, mais je ne sais pas quel est son codage.

Lorsque j'utilise le terminal et que je vérifie le codage avec la commande file -bi foo (mon système d'exploitation est Ubuntu 11.04), le résultat suivant est obtenu:

text/html; charset=us-ascii

Mais, lorsque j'ouvre le fichier avec gedit, il indique que son codage est UTF-8.

Laquelle est correcte? Je veux que le fichier soit encodé en UTF-8.

Mon hypothèse est qu'il n'y a pas de nomenclature dans le fichier et que la commande file -bi lit le fichier et ne trouve aucun caractère UTF-8. Elle suppose donc qu'il s'agit d'un fichier ASCII, mais en réalité, il est codé en UTF-8.

26
ecantu

Tout d’abord, notez que ASCII est un sous-ensemble de UTF-8, donc si votre fichier ne contient que des caractères ASCII, il est correct de dire qu’il est codé en ASCII et il est correct de dire que c'est encodé en UTF-8.

Ceci étant dit, file examine généralement uniquement un court segment au début du fichier pour déterminer son type. Il peut donc être déclaré us-ascii s'il existe des caractères non-ASCII mais situés au-delà du segment initial du fichier. D'autre part, gedit peut dire que le fichier est au format UTF-8 même s'il s'agit de ASCII, car UTF-8 est le codage de caractères préféré de gedit et il a l'intention de sauvegarder le fichier avec UTF-8 si vous ajoutiez des fichiers non -Les caractères ASCII pendant votre session de montage. Encore une fois, si c'est ce que dit gedit, ce ne serait pas faux.

Maintenant à votre question:

  1. Exécutez cette commande:

    tr -d \\000-\\177 < your-file | wc -c
    

    Si le résultat dit "0", le fichier ne contient que des caractères ASCII. C'est dans ASCII (et c'est aussi valide UTF-8) Fin de l'histoire.

  2. Exécuter cette commande

    iconv -f utf-8 -t ucs-4 < your-file >/dev/null
    

    Si vous obtenez une erreur, le fichier ne contient pas de fichier UTF-8 valide (ou au moins une partie de celui-ci est corrompue).

    Si vous n'obtenez aucune erreur, le fichier risque fort d'être UTF-8. En effet, UTF-8 a des propriétés qui rendent très difficile de confondre du texte typique avec tout autre codage de caractères couramment utilisé pour UTF-8 valide.

45
Celada
$ file --mime my.txt 
my.txt: text/plain; charset=iso-8859-1
59
Green Lei

(sous Linux)

$ chardet <filename>

il fournit également le niveau de confiance [0-1] de la sortie.

23
Arthur Zennig

Basé sur la réponse @Celada et le @ Arthur Zennig, j'ai créé ce script simple:

#/bin/bash

if [ "$#" -lt 1 ]
then
  echo "Usage: utf8-check filename"
  exit 1
fi

chardet $1
countchars="$(tr -d \\000-\\177 < $1 | wc -c)"
if [ $countchars -eq 0 ]
then
 echo "Ascii";
 exit 0
fi

{
  iconv -f utf-8 -t ucs-4 < $1 >/dev/null
  echo "UTF-8"
} || {
  echo "not UTF-8 or corrupted"
}
0
Thiago Mata