Questo messaggio è piuttosto vecchio, ma penso di poter contribuire a questo problema:
Per prima cosa crea uno script chiamato 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
Puoi usarlo in questo modo :
recodeifneeded utf-8 file.txt
Quindi, se ti piace eseguirlo in modo ricorsivo e modificare tutte le codifiche dei file *.txt in (diciamo) utf-8 :
find . -name "*.txt" -exec recodeifneeded utf-8 {} \;
Spero che questo aiuti.
Questo script, adattato dall'idea di harrymc, che ricodifica un file in modo condizionale (basato sull'esistenza di alcuni caratteri scandinavi con codifica UTF-8), sembra funzionare abbastanza bene per me.
$ 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
(L'elaborazione in batch dei file è ovviamente una semplice questione, ad esempio, di for f in *txt; do recode-to-utf8.sh $f; done
.)
NB :questo dipende totalmente dal fatto che il file di script stesso sia UTF-8. E poiché questa è ovviamente una soluzione molto limitata adatta al tipo di file che mi capita di avere, sentiti libero di aggiungere risposte migliori che risolvono il problema in modo più generico.
UTF-8 ha regole rigide su quali sequenze di byte sono valide. Ciò significa che se i dati potrebbero essere UTF-8, raramente otterrai falsi positivi se presumi che lo sia .
Quindi puoi fare qualcosa del genere (in 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')
In uno script di shell, puoi usare iconv
per eseguire la conversione, ma avrai bisogno di un mezzo per rilevare UTF-8. Un modo è usare iconv
con UTF-8 sia come codifica di origine che di destinazione. Se il file era UTF-8 valido, l'output sarà lo stesso dell'input.