Codificación de caracteres

Para texto en inglés, la codificación de caracteres más común se llama ASCII. Para letras con acento y otros caracteres no-ASCII, existen otras codificaciones (UTF-8, ASCII extendido, ISO 8859-1,...). Un intento de estandarización de codificación de caracteres se llama Unicode, dentro del cual la codificación más popular es el UTF-8. La codificación de caracteres por defecto de un sistema operativo se configura en su locale.

Descubrir la codificación de caracteres de un fichero

Podemos utilizar file para descubrir la codificación de caracteres de un fichero (también llamado "tipo de fichero"). Nota: ASCII es un subconjunto de UTF-8, por lo que algunos ficheros utf-8 pueden detectarse como ascii-us.

file nombre-de-fichero

Aquí un script de bash que lista la codificación de caracteres de todos los archivos .txt de una carpeta.

#!/bin/bash
for fileName in *.txt; do
    file "$fileName" --mime-encoding  # --mime-encoding da específicamente lo que buscamos
done

Aquí, en una línea, ver si hay algún fichero .txt que no esté en utf-8 ni us-ascii.

for fileName in *.txt; do file "$fileName" --mime-encoding | grep -v utf-8 | grep -v us-ascii; done

Convertir la codificación de caracteres de un fichero

Para conversiones, podemos utilizar iconv o enconv. Comparando iconv -l con enconv --list languages, iconv suele dar soporte a mayor cantidad de codificaciones de caracteres.

Aquí un script de bash que crea versiones UTF-8 de todos los ficheros .txt de una carpeta, guardándolas en una carpeta nueva llamada utf8-versions.

#!/bin/bash
mkdir -p utf8-versions
for fileName in *.txt; do
    fileEncoding=$(file "$fileName" --mime-encoding -b)  # -b omite el nombre del fichero
    iconv -f "$fileEncoding" -t utf-8//TRANSLIT "$fileName" -o utf8-versions/"$fileName";
done

Nota: Los editores de texto suelen permitir el modificar la codificación de caracteres de un archivo que se está editando. En gedit, aparece en la parte inferior al Guardar como.... En Vim (editor de texto), está en Edit->File Settings->File Format..., o se puede escribir :set fileformat=unix o :set fileformat=dos.

Convertir terminadores de línea

El comando file también nos da información sobre terminadores de línea. Notepad sólo reconoce CR, LF (0x0d, 0x0a) como final de línea. Podemos utilizar el comando unix2dos para asegurarnos que todas las líneas acaban en este CRLF y así ser compatibles con Notepad, sin tener que abandonar UTF-8. Nota: existe el comando dos2unix para la conversión inversa.

Referencias