pasar - shell script linux
codificaciĆ³n de script de shell de archivo (4)
¿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.
Gracias
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
esta salidas:
us-ascii
Ascii no sabe diéresis alemanas.
El archivo 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.
En shell quizás use python, perl o como dice Laurence Gonsalves 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).
No hay forma de estar 100% seguro (a menos que se trate de un formato de archivo que internamente indica 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 regresen a iso-8859-1. Puede hacer esto con iconv
"a mano", o puede usar el 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 compatibles con UTF-8 e ISO-8859-1.
$ file ascii.txt
ascii.txt: ASCII text
Por último, no existe una manera real de distinguir entre ISO-8859-1 e ISO-8859-2, por ejemplo, a menos que suponga que es un lenguaje natural y utiliza métodos estadísticos. Esta es probablemente la razón por la cual el archivo dice "ISO-8859".
Yo solo usaría
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 el file
es muy común hoy en día entre todas las distribuciones semi-modernas.
EDITAR:
Como respuesta al comentario de Laurence Gonsalves: b
es la opción para ser ''breve'' (no incluir el nombre de archivo) y i
es el equivalente abreviado de --mime
por lo que la forma más portátil (incluyendo Mac OSX) probablemente sea:
file --mime myfile.txt
puede usar el archivo de comando de file --mime myfile.text