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
- https://en.wikipedia.org/wiki/Text_file#Encoding
- https://en.wikipedia.org/wiki/ASCII
- https://es.wikipedia.org/wiki/ASCII
- https://es.wikipedia.org/wiki/Codificaci%C3%B3n_de_caracteres
- http://askubuntu.com/questions/10252/gedit-cant-recognize-character-encoding-but-gvim-can
- https://www.tecmint.com/convert-files-to-utf-8-encoding-in-linux/
- https://stackoverflow.com/questions/11303405/force-encode-from-us-ascii-to-utf-8-iconv
- https://www.cyberciti.biz/faq/howto-unix-linux-convert-dos-newlines-cr-lf-unix-text-format/
- https://superuser.com/questions/362087/notepad-ignoring-linebreaks
- https://softwareengineering.stackexchange.com/questions/152780/should-my-source-code-be-in-utf-8