Este mensaje es bastante antiguo, pero creo que puedo contribuir a este problema:
Primero cree un script llamado recodeifneeded :
#!/bin/bash
# Find the current encoding of the file
encoding=$(file -i "$2" | sed "s/.*charset=\(.*\)$/\1/")
if [ ! "$1" == "${encoding}" ]
then
# Encodings differ, we have to encode
echo "recoding from ${encoding} to $1 file : $2"
recode ${encoding}..$1 $2
fi
Puedes usarlo de esta manera:
recodeifneeded utf-8 file.txt
Entonces, si desea ejecutarlo de forma recursiva y cambiar todas las codificaciones de archivos *.txt a (digamos) utf-8:
find . -name "*.txt" -exec recodeifneeded utf-8 {} \;
Espero que esto ayude.
Este script, adaptado de la idea de harrymc, que recodifica un archivo condicionalmente (basado en la existencia de ciertos caracteres escandinavos codificados en UTF-8), parece funcionar bastante bien para mí.
$ cat recode-to-utf8.sh
#!/bin/sh
# Recodes specified file to UTF-8, except if it seems to be UTF-8 already
result=`grep -c [åäöÅÄÖ] $1`
if [ "$result" -eq "0" ]
then
echo "Recoding $1 from ISO-8859-1 to UTF-8"
recode ISO-8859-1..UTF-8 $1 # overwrites file
else
echo "$1 was already UTF-8 (probably); skipping it"
fi
(El procesamiento por lotes de archivos es, por supuesto, una simple cuestión de, por ejemplo, for f in *txt; do recode-to-utf8.sh $f; done
.)
NOTA :esto depende totalmente de que el archivo de script sea UTF-8. Y como esta es obviamente una solución muy limitada adecuada para el tipo de archivos que tengo, no dude en agregar mejores respuestas que resuelven el problema de una forma más genérica.
UTF-8 tiene reglas estrictas sobre qué secuencias de bytes son válidas. Esto significa que si los datos pudieran sea UTF-8, rara vez obtendrá falsos positivos si asume que es .
Entonces puedes hacer algo como esto (en Python):
def convert_to_utf8(data):
try:
data.decode('UTF-8')
return data # was already UTF-8
except UnicodeError:
return data.decode('ISO-8859-1').encode('UTF-8')
En un script de shell, puede usar iconv
para realizar la conversión, pero necesitará un medio para detectar UTF-8. Una forma es usar iconv
con UTF-8 como codificaciones de origen y de destino. Si el archivo era UTF-8 válido, la salida será la misma que la entrada.