Diese Nachricht ist ziemlich alt, aber ich denke, ich kann zu diesem Problem beitragen:
Erstellen Sie zuerst ein Skript mit dem Namen 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
Sie können es auf diese Weise verwenden:
recodeifneeded utf-8 file.txt
Wenn Sie es also rekursiv ausführen und alle *.txt-Dateicodierungen auf (sagen wir) utf-8 ändern möchten:
find . -name "*.txt" -exec recodeifneeded utf-8 {} \;
Ich hoffe, das hilft.
Dieses Skript, angepasst an die Idee von Harrymc, das eine Datei bedingt neu codiert (basierend auf der Existenz bestimmter UTF-8-codierter skandinavischer Zeichen), scheint für mich ziemlich gut zu funktionieren.
$ 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
(Stapelverarbeitung von Dateien ist natürlich eine einfache Sache von z.B. for f in *txt; do recode-to-utf8.sh $f; done
.)
NB :Dies hängt vollständig davon ab, dass die Skriptdatei selbst UTF-8 ist. Und da dies offensichtlich eine sehr begrenzte Lösung ist, die für die Art von Dateien geeignet ist, die ich zufällig habe, fühlen Sie sich frei, bessere Antworten hinzuzufügen die das Problem allgemeiner lösen.
UTF-8 hat strenge Regeln darüber, welche Bytesequenzen gültig sind. Das bedeutet, wenn Daten könnten UTF-8 sein, werden Sie selten falsch positive Ergebnisse erhalten, wenn Sie davon ausgehen, dass es ist .
Sie können also so etwas tun (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 einem Shell-Skript können Sie iconv
verwenden Um die Konvertierung durchzuführen, benötigen Sie jedoch eine Möglichkeit, UTF-8 zu erkennen. Eine Möglichkeit ist die Verwendung von iconv
mit UTF-8 als Quell- und Zielkodierung. Wenn die Datei gültiges UTF-8 war, ist die Ausgabe dieselbe wie die Eingabe.