¿Cómo puedo verificar la codificación del archivo en un script de shell? Necesito saber si un archivo está codificado en utf-8 o iso-8859-1.codificación de script de shell de archivo
Gracias
¿Cómo puedo verificar la codificación del archivo en un script de shell? Necesito saber si un archivo está codificado en utf-8 o iso-8859-1.codificación de script de shell de archivo
Gracias
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
puede utilizar el comando de archivo file --mime myfile.text
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".
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).
'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. –
@Laurence Gonsalves: gracias por informarme, he actualizado la respuesta en consecuencia. – ChristopheD
obtengo 'unknown-8bit' en un archivo codificado en' Windows-1250' – gondo