Frage

Ich brauche die Codierung aller Dateien zu finden, die in einem Verzeichnis abgelegt werden. Gibt es eine Möglichkeit, die Codierung verwendet zu finden?

Der file Befehl ist nicht in der Lage, dies zu tun.

Die Codierung, die von Interesse für mich ist: ISO-8859-1. Wenn die Codierung etwas anderes ist, möchte ich die Datei in ein anderes Verzeichnis verschieben.

War es hilfreich?

Lösung

Klingt wie Sie für enca suchen. Es kann erraten und wandeln sogar zwischen Kodierungen. Schauen Sie sich die Manpage .

oder andernfalls, Verwendung file -i (Linux) oder file -I (osx). Das wird ausgegeben MIME-Typinformationen für die Datei, die auch die Zeichensatz-Codierung umfasst. Ich fand eine Mann-Seite es auch:)

Andere Tipps

file -bi <file name>

Wenn Sie diese Dateien für einen Haufen tun

for f in `find | egrep -v Eliminate`; do echo "$f" ' -- ' `file -bi "$f"` ; done

uchardet -. Eine Codierung Detektor Bibliothek von Mozilla portiert

Verbrauch:

~> uchardet file.java 
UTF-8

Verschiedene Linux-Distributionen (Debian / Ubuntu, OpenSuse-packman, ...) Binärdateien zur Verfügung stellen.

Hier ist ein Beispiel-Skriptdatei -I und iconv verwendet, die auf MacOsX arbeitet Für Ihre Frage müssen Sie mv statt iconv verwenden

#!/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

Es ist wirklich schwer zu bestimmen, ob es iso-8859-1 ist. Wenn Sie einen Text mit nur 7-Bit-Zeichen haben, die auch iso-8859-1 sein könnten, aber man weiß es nicht. Wenn Sie 8-Bit-Zeichen haben dann existieren die oberen Bereich Zeichen, um Kodierungen auch. Dafür Sie ein Wörterbuch verwenden, müßten eine bessere Vermutung zu bekommen, das Wort ist und bestimmen, von dort dem Brief muss es sein. Schließlich, wenn Sie feststellen, dass es utf-8 sein könnte, als Sie sicher sind, ist es nicht iso-8859-1

Codierung ist eines der schwierigsten Dinge zu tun, weil man nie weiß, ob nichts sagt Ihnen

Mit Python können Sie das chardet Modul verwenden: https://github.com/chardet/chardet

In Debian können Sie auch: encguess:

$ encguess test.txt
test.txt  US-ASCII

Das ist nicht etwas, das man in einer harmlosen Weise tun können. Eine Möglichkeit wäre, jedes Zeichen in der Datei zu prüfen, um sicherzustellen, dass es keine Zeichen enthält in den Bereichen 0x00 - 0x1f oder 0x7f -0x9f aber, wie gesagt, dies für eine beliebige Anzahl von Dateien wahr sein kann, einschließlich mindestens einer anderen Variante ISO8859.

Eine weitere Möglichkeit besteht darin, bestimmte Worte in der Datei in allen Sprachen zu suchen unterstützt und sehen, ob Sie sie finden können.

So zum Beispiel findet das Äquivalent der englischen „und“, „aber“, „auf“, „von“ und so weiter in allen unterstützten Sprachen von 8859-1 und sehen, ob sie eine großen Anzahl von haben Vorkommen innerhalb der Datei.

Ich spreche nicht über wörtliche Übersetzung wie:

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

obwohl das möglich ist. Ich spreche über gemeinsame Wörter in der Zielsprache (für alles, was ich weiß, hat Icelandic kein Wort für „und“ - Sie würden wahrscheinlich ihr Wort für „Fisch“ verwenden [traurig das ist ein wenig stereotypisch, habe ich nicht bedeutet jede Straftat, nur einen Punkt darstellt]).

Wenn Sie sprechen über XML-Dateien (ISO-8859-1), die XML-Deklaration in ihnen gibt die Codierung: <?xml version="1.0" encoding="ISO-8859-1" ?>
So können Sie reguläre Ausdrücke verwenden (zum Beispiel mit perl) jede Datei für diese Spezifikation zu überprüfen.
Weitere Informationen finden Sie hier: Wie Textdatei Encoding bestimmen.

Zur Umwandlung der Codierung von 8859 bis ASCII:

iconv -f ISO_8859-1 -t ASCII filename.txt

Ich weiß, dass Sie in eine allgemeinere Antwort interessiert sind, aber was in ASCII gut ist, ist in der Regel gut in andere Codierungen. Hier ist ein Python-Einzeiler, um zu bestimmen, ob die Standardeingabe ASCII ist. (Ich bin mir ziemlich sicher, dass dies in Python funktioniert 2, aber ich habe nur getestet es auf Python 3).

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

In Cygwin, das sieht aus wie es funktioniert für mich:

find -type f -name "<FILENAME_GLOB>" | while read <VAR>; do (file -i "$<VAR>"); done

Beispiel:

find -type f -name "*.txt" | while read file; do (file -i "$file"); done

Sie könnten Rohr, das zu awk und einen Befehl iconv schaffen, alles zu UTF8 konvertieren, aus einer beliebigen Quelle Codierung von iconv unterstützt.

Beispiel:

find -type f -name "*.txt" | while read file; do (file -i "$file"); done | awk -F[:=] '{print "iconv -f "$3" -t utf8 \""$1"\" > \""$1"_utf8\""}' | bash

Sie können Codierung einer einzelnen Datei mit dem Dateibefehl extrahieren. Ich habe eine sample.html Datei mit:

$ file sample.html 

sample.html: HTML-Dokument, UTF-8 Unicode-Text, mit sehr langen Linien

$ file -b sample.html

HTML-Dokument, UTF-8 Unicode-Text, mit sehr langen Linien

$ file -bi sample.html

text / html; charset = utf-8

$ file -bi sample.html  | awk -F'=' '{print $2 }'

utf-8

Ich bin mit dem folgende Skript

  1. Alle Dateien, die FILTER mit src_codierung
  2. entsprechen
  3. Erstellen Sie eine Sicherung von ihnen
  4. wandeln sie in DST_ENCODING
  5. (optional) Entfernen Sie die Sicherungen

.

#!/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 {} \;

Mit Perl, Verwendung Encode :: erkennen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top