Codificaciones de caracteres compatibles con más, gato y menos

18

Tengo un archivo de texto codificado de la siguiente manera según file:

Texto ISO-8859, con terminadores de línea CRLF

Este archivo contiene texto en francés con acentos. Mi shell puede mostrar acento y emacsen modo consola es capaz de mostrar correctamente estos acentos.

Mi problema es eso more, caty las lessherramientas no muestran este archivo correctamente. Supongo que significa que estas herramientas no admiten este conjunto de codificación de caracteres. ¿Es esto cierto? ¿Cuáles son las codificaciones de caracteres compatibles con estas herramientas?

Manuel Selva
fuente

Respuestas:

17

Su shell puede mostrar acentos, etc. porque probablemente esté usando UTF-8. Dado que el archivo en cuestión es una codificación diferente, less morey catestán tratando de leerlo como UTF y fallar. Puede verificar su codificación actual con

echo $LANG

Tiene dos opciones, puede cambiar su codificación predeterminada o cambiar el archivo a UTF-8. Para cambiar su codificación, abra una terminal y escriba

export LANG="fr_FR.ISO-8859"

Por ejemplo:

$ echo $LANG 
en_US.UTF-8
$ cat foo.txt 
J'ai mal � la t�te, c'est chiant!
$ export LANG="fr_FR.ISO-8859"
$ xterm <-- open a new terminal 
$ cat foo.txt 
J'ai mal à la tête, c'est chiant!

Si está utilizando gnome-terminalo similar, es posible que deba activar la codificación, por ejemplo, para terminatorhacer clic con el botón derecho y:

ingrese la descripción de la imagen aquí

Para gnome-terminal:

ingrese la descripción de la imagen aquí

Su otra (mejor) opción es cambiar la codificación del archivo:

$ cat foo.txt 
J'ai mal � la t�te, c'est chiant!
$ iconv -f ISO-8859-1 -t UTF-8  foo.txt > bar.txt
$ cat bar.txt 
J'ai mal à la tête, c'est chiant!
terdon
fuente
4

Las codificaciones de caracteres ISO-8858 están un poco desactualizadas para los sistemas Linux. Es probable que todo su sistema Linux esté usando UTF-8 todo el tiempo. Incluyendo su emulador de terminal y su shell.

Sin embargo. cat, grepy lessno realice ninguna transformación de codificación, tratarán su archivo ISO-8859 / latin1 como UTF-8, lo que no funcionará.

Si emacs puede mostrarlos, es porque intenta detectar automáticamente la codificación utilizada y aparentemente tiene éxito. Dígale a emacs que guarde el archivo como UTF-8 y podrá usar cat/ grep/ lo que sea en él.

Si conoce la codificación de caracteres exacta (ISO-8859 es una colección de ellos, debe conocer la exacta: ISO-8859-1 o ISO-8859-15 o peor), también puede convertir sus archivos desde la línea de comandos :

iconv --from-code ISO-8859-15 your_file -o your_file_as_utf8
BatchyX
fuente
2

Cat, More and Less solo están haciendo su trabajo de mostrar el archivo. La traducción entre codificaciones no está en la descripción de su trabajo. La codificación de nuevas líneas no es un problema ya que CRLF se muestra como la línea normal que termina en LF, pero su terminal probablemente espera texto codificado en UTF-8, que es el estándar de facto hoy en día.

Luit se traduce entre codificaciones compatibles y UTF-8. Le dice a Luit qué codificación traducir traduciendo la LC_CTYPEvariable de entorno o con la -encodingopción. Por ejemplo, para mostrar un archivo latin-1 (también conocido como ISO 8859-1):

LC_CTYPE=en_US luit less somefile
luit -encoding ISO8859-1 less somefile

Si el archivo tiene una codificación exótica que Luit no admite, puede canalizarlo a través de un programa de traducción. Iconv admite muchas codificaciones.

iconv -f latin1 somefile
iconv -f latin1 somefile | less
Gilles 'SO- deja de ser malvado'
fuente