script pasar parametros espaƱol ejemplos comandos change linux bash shell encoding

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