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.

12voto

Wolfgang Fahl Punkte 13424

Hier ist ein Beispielskript mit file -Iikonv das unter Mac OS X funktioniert.

Für Ihre Frage müssen Sie Folgendes verwenden mv anstelle von iconv :

#!/bin/bash
# 2016-02-08
# check encoding and convert files
for f in *.java
do
  encoding=`file -I $f | cut -f 2 -d";" | cut -f 2 -d=`
  case $encoding in
    iso-8859-1)
    iconv -f iso8859-1 -t utf-8 $f > $f.utf8
    mv $f.utf8 $f
    ;;
  esac
done

8voto

fccoelho Punkte 5682

Mit Python können Sie die chardet Modul.

7voto

Norbert Hartl Punkte 10085

Es ist wirklich schwer festzustellen, ob es sich um ISO 8859-1 handelt. Wenn Sie einen Text mit nur 7-Bit-Zeichen haben, könnte das auch ISO 8859-1 sein, aber Sie wissen es nicht. Wenn Sie 8-Bit-Zeichen haben, dann gibt es die Zeichen des oberen Bereichs auch in Ordnungskodierungen. Daher müssten Sie ein Wörterbuch verwenden, um zu erraten, um welches Wort es sich handelt, und von dort aus bestimmen, um welchen Buchstaben es sich handeln muss. Wenn Sie schließlich feststellen, dass es sich um UTF-8 handeln könnte, sind Sie sicher, dass es sich nicht um ISO 8859-1 handelt.

Die Verschlüsselung ist eine der schwierigsten Aufgaben, weil man nie weiß, ob man nicht doch etwas erfährt.

7voto

danilo Punkte 4992

Mit diesem Befehl:

for f in `find .`; do echo `file -i "$f"`; done

können Sie alle Dateien in einem Verzeichnis und Unterverzeichnissen sowie die entsprechende Kodierung auflisten.

Wenn Dateien ein Leerzeichen im Namen haben, verwenden Sie:

IFS=$'\n'
for f in `find .`; do echo `file -i "$f"`; done

Denken Sie daran, dass dadurch der Interpreter Ihrer aktuellen Bash-Sitzung für "Leerzeichen" geändert wird.

4voto

Mohamed23gharbi Punkte 1561

In PHP können Sie dies wie folgt überprüfen:

Explizite Angabe der Kodierungsliste:

php -r "echo 'probably : ' . mb_detect_encoding(file_get_contents('myfile.txt'), 'UTF-8, ASCII, JIS, EUC-JP, SJIS, iso-8859-1') . PHP_EOL;"

Genauer "mb_list_encodings":

php -r "echo 'probably : ' . mb_detect_encoding(file_get_contents('myfile.txt'), mb_list_encodings()) . PHP_EOL;"

Hier im ersten Beispiel können Sie sehen, dass ich eine Liste von Kodierungen verwendet habe (Listenreihenfolge erkennen), die übereinstimmen könnten. Um ein genaueres Ergebnis zu erhalten, können Sie alle möglichen Kodierungen über verwenden: mb_list_encodings()

Beachten Sie, dass die mb_* Funktionen php-mbstring benötigen:

apt-get install php-mbstring

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