Tato zpráva je poměrně stará, ale myslím, že mohu přispět k tomuto problému:
Nejprve vytvořte skript s názvem 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
Můžete jej použít takto:
recodeifneeded utf-8 file.txt
Pokud jej tedy chcete spouštět rekurzivně a změnit všechna kódování souborů *.txt na (řekněme) utf-8 :
find . -name "*.txt" -exec recodeifneeded utf-8 {} \;
Doufám, že to pomůže.
Tento skript, upravený podle harrymcovy myšlenky, který podmíněně překóduje jeden soubor (na základě existence určitých skandinávských znaků kódovaných UTF-8), se mi zdá snesitelně dobrý.
$ 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
(Dávkové zpracování souborů je samozřejmě jednoduchá záležitost, např. for f in *txt; do recode-to-utf8.sh $f; done
.)
Pozn. :to zcela závisí na tom, že samotný soubor skriptu je UTF-8. A protože toto je zjevně velmi omezené řešení vhodné pro to, jaké soubory náhodou mám, neváhejte přidat lepší odpovědi které problém řeší obecnějším způsobem.
UTF-8 má přísná pravidla o tom, které sekvence bajtů jsou platné. To znamená, že pokud data mohla pokud je UTF-8, málokdy dostanete falešné poplachy, pokud předpokládáte, že je .
Takže můžete udělat něco takového (v Pythonu):
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')
Ve skriptu shellu můžete použít iconv
k provedení převodu, ale budete potřebovat prostředek pro detekci UTF-8. Jedním ze způsobů je použití iconv
s UTF-8 jako zdrojovým i cílovým kódováním. Pokud byl soubor platný UTF-8, výstup bude stejný jako vstup.