2012-06-13 21 views
23

Tengo un archivo PHP que he creado con VIM, pero no estoy seguro de cuál es su codificación.¿Cómo puedo estar seguro de la codificación del archivo?

Cuando uso el terminal y comprobar la codificación con el file -bi foo comando (Mi sistema operativo es Ubuntu 11.04) me da el siguiente resultado:

text/html; charset=us-ascii

Pero, al abrir el archivo con gedit dice que su codificación es UTF-8.

¿Cuál es correcto? Quiero que el archivo se codifique en UTF-8.

Supongo que no hay BOM en el archivo y que el comando file -bi lee el archivo y no encuentra ningún carácter UTF-8, por lo que supone que es ascii, pero en realidad está codificado en UTF-8.

+0

caracteres no ASCII Lo que están en su archivo? – dan04

Respuesta

39

Bueno, en primer lugar, cabe destacar que ASCII es un subconjunto de UTF-8, por lo que si el archivo contiene sólo caracteres ASCII, es correcto decir que está codificado en ASCII y es correcto decir que está codificado en UTF-8.

Dicho esto, file normalmente solo examina un segmento corto al principio del archivo para determinar su tipo, por lo que podría estar declarándolo us-ascii si hay caracteres no ASCII pero están más allá del segmento inicial de el archivo. Por otro lado, gedit podría decir que el archivo es UTF-8 incluso si es ASCII porque UTF-8 es la codificación de caracteres preferida de gedit y tiene la intención de guardar el archivo con UTF-8 si agregaste caracteres no ASCII durante tu sesión de edición De nuevo, si eso es lo que dice gedit, no estaría mal.

Ahora a su pregunta:

  1. Ejecutar este comando:

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

    Si la salida dice "0", el archivo contiene sólo caracteres ASCII. Está en ASCII (y también es válido UTF-8) Fin de la historia.

  2. Ejecutar este comando

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

    Si se produce un error, el archivo no contiene UTF-8 (o al menos, está dañado alguna parte del mismo) válida.

    Si no obtiene ningún error, es muy probable que el archivo sea UTF-8. Eso es porque UTF-8 tiene propiedades que hacen que sea muy difícil confundir texto típico en cualquier otra codificación de caracteres comúnmente utilizada para UTF-8 válido.

+0

El primer comando devolvió 0 y el segundo comando no devolvió un error, por lo que podemos decir que es UTF-8. ¡Gracias! – ecantu

+0

me está dando 1120, ¿qué significa esto? – jazzz

+1

* ¿Qué * le está dando 1120? El 'wc'? Si es así, supongo que tiene 1120 bytes no ASCII en el archivo. – Celada

48
$ file --mime my.txt 
my.txt: text/plain; charset=iso-8859-1 
+0

¡Esto me salvó! ¡muchas gracias! – daveomcd

+4

Me parece importante señalar que, como @Celada ya ha mencionado, 'file' no puede * otorgar * que su detección sea 100% correcta. –

14

(en Linux)

$ chardet <filename> 

sino que también ofrece un nivel de confianza [0-1] de la salida.

0

Basado en respuesta @Celada y la @Arthur Zennig, he creado este script sencillo:

#/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" 
} 
Cuestiones relacionadas