Gibt es einen Linux-Befehl, um herauszufinden, ob eine Datei UTF-8 ist?

14

Die Joomla- .iniDateien müssen als UTF-8 gespeichert werden.

Nach der Bearbeitung bin ich mir nicht sicher, ob die Dateien UTF-8 sind oder nicht.

Gibt es einen Linux-Befehl wie fileoder einige Befehle, die erkennen lassen, ob eine Datei tatsächlich UTF-8 ist oder nicht?

Edward
quelle
4
Sie können die Codierung einer Datei nicht erkennen. Sie können nur eine kluge Vermutung anstellen. Sie können meistens richtig raten, aber manchmal scheitern Vermutungen. fileist ein Beispiel für ein Programm, das kluge Vermutungen anstellt.
Marco
1
@Marco: Es ist jedoch möglich zu überprüfen, ob UTF-8 gültig ist oder nicht. Es gibt einige Codierungen, die fälschlicherweise als gültiges UTF-8 übergeben werden können, aber bei ISO-8859-𝒏- oder Windows-125𝒏-Codierungen / Zeichensätzen kommt dies fast nie vor.
user1686

Antworten:

28

Sie können die Dateicodierung mit dem folgenden Befehl bestimmen:

file -bi filename
Rik
quelle
3
@nicolas Für MacOS könnten Sie versuchen file -I filename( -Ich bin ein Kapital i).
Rik
5
Liest dies die gesamte Datei?
Strg-Alt-Delor
2
@ kojow7 utf-8 hat keinen Header. Reines ASCII (nur 7-Bit) ist nicht von utf-8 zu unterscheiden (das ist der Punkt, ein Header verursacht alle möglichen Probleme). Wenn Sie also eine ASCII-Datei für das erste MB haben, die ein einzelnes UTF-8-Zeichen enthält, wissen Sie es nicht, es sei denn, Sie lesen die gesamte Datei.
Strg-Alt-Delor
3
Dies sollte nicht als Antwort akzeptiert werden. Der Befehl 'file' macht das nicht; Es liest nur einen Teil der Datei und verwendet magische Zahlen, um eine bestmögliche Vermutung anzustellen. Gelegentlich kann und wird 'Datei' Ihnen die falsche Antwort geben. Um zu überprüfen, ob eine Datei eine Codierung wie ascii, iso-8859-1, utf-8 oder was auch immer besteht, ist es eine gute Lösung, den Befehl 'iconv' zu verwenden.
Tim
1
Ich habe es getestet und es kann und tut fehlschlagen.
Tim
9

Verwenden Sie den isutf8Befehl aus dem Paket moreutils .

Quelle: Wie können Sie feststellen, ob eine Datei UTF-8-codiert ist oder nicht?


Pablo Olmos de Aguilera C.
quelle
@davidpostill Ich bin neugierig, ist es eine schlechte Praxis, den Autor in der Referenz zu zitieren?
Pablo Olmos de Aguilera C.
Nein , aber es ist eine gute Praxis , den Link sagen zu machen , wo es mich führt. Angenommen, ich lese nur den blauen Text. Nach der Bearbeitung kann ich sagen, warum und wann ich darauf klicken soll. Vorher konnte ich nicht. (Ich war es nicht, der die Bearbeitung vorgenommen hat, aber ich bin mir zu 94% sicher, dass es darum ging.)
Hermann Döppes
Schön und funktioniert gut mit find -type f -exec isutf8 {} +, weil es auch den Dateinamen zitiert. (Und mit der Verwendung find ... -exec ... +ist auch schnell)
Tomasz Gandor
2

Verwenden Sie den fileBefehl nicht. Es wird nicht die gesamte Datei überprüft, und es wird im Grunde genommen geraten. Es gibt manchmal falsche Antworten.

Sie können überprüfen, ob eine Datei die UTF-8-Codierung wie folgt besteht:

$ iconv -f utf8 <filename> -t utf8 -o /dev/null

Ein Rückkehrcode von Null bedeutet, dass UTF8 bestanden wird. Ein Rückkehrcode ungleich Null bedeutet, dass UTF8 nicht gültig ist.

Es ist nicht möglich zu wissen, ob eine Datei notwendigerweise unter Verwendung eines bestimmten Codierungsschemas exportiert wurde, da sich einige Codierungsschemata überschneiden. Um dies zu tun, müssten Metadaten in die Datei eingebettet werden, und selbst dann würden Sie demjenigen vertrauen, der diese Datei generiert hat, anstatt sie selbst zu validieren ... und Sie sollten sie immer selbst validieren.

Tim
quelle
0

Eine weitere Möglichkeit ist die Verwendung recode, die mit einem Fehler beendet wird, wenn versucht wird, UTF-8 zu dekodieren, und ungültige Zeichen festgestellt werden.

if recode utf8/..UCS < "$FILE" >/dev/null 2>&1; then
    echo "Valid utf8 : $FILE"
else
    echo "NOT valid utf8: $FILE"
fi
mivk
quelle