2009-11-13 15 views

Respuesta

57

yo sólo haría uso de

file -bi myfile.txt 

para determinar la codificación de caracteres de un archivo en particular.

Una solución con una dependencia externa pero sospecho que file es muy común hoy en día entre todas las distribuciones semi-modernas.

EDIT:

Como respuesta a Laurence Gonsalves comentario: b es la opción de ser 'breve' (no incluir el nombre del archivo) y i es el equivalente abreviada de --mime lo que la forma más portátil (incluyendo Mac OS X), entonces probablemente lo es:

file --mime myfile.txt 
+8

'file -bi' funciona para mí en Linux, pero no en OS-X. En OS-X dice respecto de "archivo regular" de la codificación. 'file --mime' o simplemente' file' sin indicadores funciona tanto en OS-X como en Linux. –

+0

@Laurence Gonsalves: gracias por informarme, he actualizado la respuesta en consecuencia. – ChristopheD

+1

obtengo 'unknown-8bit' en un archivo codificado en' Windows-1250' – gondo

8

puede utilizar el comando de archivo file --mime myfile.text

9

No hay forma de estar 100% seguro (a menos que esté tratando con un formato de archivo que internamente indique su codificación).

La mayoría de las herramientas que intentan hacer esta distinción intentarán decodificar el archivo como utf-8 (ya que esa es la codificación más estricta), y si eso falla, entonces vuelvan a iso-8859-1. Usted puede hacer esto con iconv "a mano", o puede utilizar file:

$ file utf8.txt 
utf8.txt: UTF-8 Unicode text 
$ file latin1.txt 
latin1.txt: ISO-8859 text 

Tenga en cuenta que los archivos ASCII son tanto UTF-8 y compatible ISO-8859-1.

$ file ascii.txt 
ascii.txt: ASCII text 

Por último: no hay forma real de distinguir entre ISO-8859-1 e ISO-8859-2, por ejemplo, a menos que usted va a asumir que es el lenguaje natural y el uso de métodos estadísticos. Esta es probablemente la razón por la cual el archivo dice "ISO-8859".

4

El comando de archivo no es 100% seguro. Prueba simple:

#!/bin/bash 

echo "a" > /tmp/foo 

for i in {1..1000000} 
do 
    echo "asdas" >> /tmp/foo 
done 

echo "üöäÄÜÖß " >> /tmp/foo 

file -b --mime-encoding /tmp/foo 

este salidas:

us-ascii 

ASCII no sabe diéresis alemanas.

de archivos es un grupo de bytes (secuencia de bytes). Sin confiar en los metadatos (la BOM solo es recomendable para utf-16 y utf-32, MIME, encabezado de datos) no se puede detectar realmente la codificación. La secuencia de bytes se puede interpretar como utf-8 o ISO-8859-1/2 o cualquier cosa que desee. Bueno, depende de cierta secuencia si existe el mapa iso-8850-1/utf-8. Lo que desea es codificar todo el contenido del archivo con la codificación de caracteres deseada. Si falla, la codificación deseada no tiene un mapa para esta secuencia de bytes.

Con cáscara tal vez usar Python, Perl o como Laurence Gonsalves dice iconv.Para los archivos de texto que uso en Python esto:

f = codecs.open(path, encoding='utf-8', errors='strict') 


def valid_string(str): 
    try: 
    str.decode('utf-8') 
    return True 
    except UnicodeDecodeError: 
    return False 

¿Cómo es que un archivo es un archivo de texto. Tu no Codifica línea por línea con la codificación de caracteres deseada. De acuerdo, puede agregar un poco de confianza y verificar si la BOM existe (el archivo está codificado para utf).