439 Stimmen

Wie kann ich die Kodierung einer Datei über ein Skript unter Linux ermitteln?

Ich muss die Kodierung aller Dateien finden, die sich in einem Verzeichnis befinden. Gibt es eine Möglichkeit, die verwendete Kodierung zu ermitteln?

があります。 file Befehl ist dazu nicht in der Lage.

Die Kodierung, die mich interessiert, ist ISO 8859-1 . Wenn die Kodierung eine andere ist, möchte ich die Datei in ein anderes Verzeichnis verschieben.

3voto

paxdiablo Punkte 809679

Dies ist keine narrensichere Methode, die man anwenden kann. Eine Möglichkeit wäre, jedes Zeichen in der Datei zu untersuchen, um sicherzustellen, dass es keine Zeichen in den Bereichen 0x00 - 0x1f oder 0x7f -0x9f aber, wie ich schon sagte, kann dies für eine beliebige Anzahl von Dateien zutreffen, einschließlich mindestens einer anderen Variante von ISO 8859.

Eine andere Möglichkeit besteht darin, in der Datei nach bestimmten Wörtern in allen unterstützten Sprachen zu suchen und zu sehen, ob Sie diese finden.

Suchen Sie z. B. die Entsprechungen des englischen "and", "but", "to", "of" usw. in allen von ISO 8859-1 unterstützten Sprachen und prüfen Sie, ob sie in der Datei in großer Zahl vorkommen.

Ich spreche nicht von einer wörtlichen Übersetzung wie etwa:

English   French
-------   ------
of        de, du
and       et
the       le, la, les

obwohl das möglich ist. Ich spreche von gebräuchlichen Wörtern in der Zielsprache (soweit ich weiß, gibt es im Isländischen kein Wort für "und" - Sie müssten wahrscheinlich ihr Wort für "Fisch" verwenden [entschuldigen Sie, dass das ein wenig klischeehaft ist. Ich wollte Ihnen damit nicht zu nahe treten, sondern nur einen Punkt illustrieren]).

2voto

wkschwartz Punkte 3607

Ich weiß, dass Sie an einer allgemeineren Antwort interessiert sind, aber was in ASCII gut ist, ist normalerweise auch in anderen Kodierungen gut. Hier ist ein Python-Einzeiler, um festzustellen, ob die Standardeingabe ASCII ist. (Ich bin mir ziemlich sicher, dass dies in Python 2 funktioniert, aber ich habe es nur mit Python 3 getestet).

python -c 'from sys import exit,stdin;exit()if 128>max(c for l in open(stdin.fileno(),"b") for c in l) else exit("Not ASCII")' < myfile.txt

2voto

evgeny9 Punkte 1321

Wenn es sich um XML-Dateien (ISO-8859-1) handelt, wird die Kodierung in der XML-Deklaration angegeben: <?xml version="1.0" encoding="ISO-8859-1" ?> Sie können also reguläre Ausdrücke (z. B. mit Perl) verwenden, um jede Datei auf solche Angaben zu prüfen.

Weitere Informationen finden Sie hier: Wie man die Kodierung von Textdateien bestimmt .

2voto

Teocci Punkte 5144

Ich habe an einem Projekt gearbeitet, das plattformübergreifende Unterstützung erfordert, und bin auf viele Probleme im Zusammenhang mit der Dateikodierung gestoßen.

Ich habe dieses Skript erstellt, um alles in utf-8 zu konvertieren:

#!/bin/bash
## Retrieve the encoding of files and convert them
for f  `find "$1" -regextype posix-egrep -regex ".*\.(cpp|h)$"`; do
  echo "file: $f"
  ## Reads the entire file and get the enconding
  bytes_to_scan=$(wc -c < $f)
  encoding=`file -b --mime-encoding -P bytes=$bytes_to_scan $f`
  case $encoding in
    iso-8859-1 | euc-kr)
    iconv -f euc-kr -t utf-8 $f > $f.utf8
    mv $f.utf8 $f
    ;;
  esac
done

Ich habe einen Hack verwendet, um die gesamte Datei zu lesen und die Dateikodierung zu schätzen, indem ich file -b --mime-encoding -P bytes=$bytes_to_scan $f

1voto

Matyas Punkte 12853

Ich verwende das folgende Skript, um

  1. Suche nach allen Dateien, die FILTER mit SRC_ENCODING entsprechen
  2. Erstellen Sie eine Sicherungskopie von ihnen
  3. Konvertieren Sie sie in DST_ENCODING
  4. (optional) Entfernen Sie die Backups

    !/bin/bash -xe

    SRC_ENCODING="iso-8859-1" DST_ENCODING="utf-8" FILTER="*.java"

    echo "Find all files that match the encoding $SRC_ENCODING and filter $FILTER" FOUND_FILES=$(find . -iname "$FILTER" -exec file -i {} \; | grep "$SRC_ENCODING" | grep -Eo '^.*.java')

    for FILE in $FOUND_FILES ; do ORIGINAL_FILE="$FILE.$SRC_ENCODING.bkp" echo "Backup original file to $ORIGINAL_FILE" mv "$FILE" "$ORIGINAL_FILE"

    echo "converting $FILE from $SRC_ENCODING to $DST_ENCODING"
    iconv -f "$SRC_ENCODING" -t "$DST_ENCODING" "$ORIGINAL_FILE" -o "$FILE"

    done

    echo "Deleting backups" find . -iname "*.$SRC_ENCODING.bkp" -exec rm {} \;

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X