Ya hemos visto anteriormente como cambiar la codificación del nombre de ficheros en Linux Ahora veremos como cambiar la codificación de su contenido con la ayuda del comando iconv. La mayoría de las veces el cambio que necesitaremos será de LATIN1 a UTF8 o viceversa.
Primero debemos saber la codificación actual del archivo con el comando file:
file archivo.php
archivo.php: PHP script, ISO-8859 text
Vemos que es ISO-8859, que corresponde a LATIN1.
Comprobamos con iconv -l las posibles codificaciones que soporta, y vemos que ISO-8859 exactamente no está, pero sí ISO-8859-1, ISO-8859-2, etc. Usaremos ISO-8859-1 que corresponde a LATIN1. Para pasarlo a utf8 usaremos:
iconv -f ISO-8859-1 -t utf8 archivo.php -o archivo-nuevo.php
- -f: --from-code, la codificación actual del fichero
- -t: --to-code, la codificación que deseamos tener
- -o: --output, el fichero con la nueva codificación. Si ejecutamos el comando sin este parámetro mostrará el fichero por pantalla pero no hará nada con él.
En el ejemplo también podriamos haber usado LATIN1 en lugar de ISO-8859-1 para hacer la conversión.
En github tenemos un script muy útil para cambiar la codificación de ficheros html, php, css y js recursivamente, borrando el original:
find ./ -name "*.php" -o -name "*.html" -o -name "*.css" -o -name "*.js" -type f |
while read file
do
echo " $file"
mv $file $file.icv
iconv -f ISO-8859-1 -t UTF-8 $file.icv > $file
rm -f $file.icv
done
Podemos modificarlo facilmente para otras extensiones de archivo.
Codificación de acentos HTML
Otro problema habitual lo tenemos con el html interpretando mal los acentos.
En estos casos cambiaremos las vocales acentuadas y ñ por sus equivalentes HTML:
find . -type f -name '*php' -exec sed -i 's/á/\á/g' {} +
find . -type f -name '*php' -exec sed -i 's/é/\é/g' {} +
find . -type f -name '*php' -exec sed -i 's/í/\í/g' {} +
find . -type f -name '*php' -exec sed -i 's/ó/\ó/g' {} +
find . -type f -name '*php' -exec sed -i 's/ú/\ú/g' {} +
find . -type f -name '*php' -exec sed -i 's/ñ/\ñ/g' {} +
También puede ayudarnos el comando recode:
echo 'avión' | recode ..html
avión
echo 'avión' | recode html/..
avión