Wie erkenne ich die Kodierung einer Datei?

115

Auf meinem Dateisystem (Windows 7) habe ich einige Textdateien (dies sind SQL-Skriptdateien, falls dies wichtig ist).

Beim Öffnen mit Notepad ++ wird im Menü "Codierung" angegeben, dass einige von ihnen eine Codierung von "UCS-2 Little Endian" und einige von "UTF-8 ohne Stückliste" aufweisen.

Was ist der Unterschied hier? Sie scheinen alle perfekt gültige Skripte zu sein. Wie kann ich feststellen, welche Codierungen die Datei ohne Notepad ++ hat?

Marcel
quelle
7
Es gibt eine ziemlich einfache Möglichkeit, Firefox zu verwenden. Öffnen Sie Ihre Datei mit Firefox und wählen Sie Ansicht> Zeichenkodierung. Ausführlich hier .
Catherine Gasnier
Heuristiken verwenden. Kasse encaund chardetfür POSIX-Systeme.
Janus Troelsen
3
Ich denke, eine alternative Antwort ist TRIAL und ERROR. iconvInsbesondere ist dies für diesen Zweck nützlich. Im Wesentlichen iterieren Sie die fehlerhaften Zeichenfolgen / Texte durch verschiedene Codierungen, um festzustellen, welche funktionieren. Sie gewinnen, wenn die Charaktere nicht mehr beschädigt sind. Ich würde gerne hier mit einem programmatischen Beispiel antworten. Aber es ist leider eine geschützte Frage.
Brandon Bertelsen
FF verwendet Mozilla Charset Detectors . Eine andere einfache Möglichkeit ist das Öffnen der Datei mit MS Word. Die Dateien werden sogar für verschiedene alte chinesische und japanische Codepages richtig
geraten
Wenn chardetoder chardetectnicht verfügbar auf Ihrem System, dann können Sie das Paket über Ihren Paketmanager (zB apt search chardet- auf Ubuntu / Debian heißt das Paket normalerweise python-chardetoder python3-chardet) oder über Pip mit pip install chardet(oder pip install cchardetfür die schnellere c-optimierte Version) installieren .
ccpizza

Antworten:

97

Dateien werden in der Regel mit einem Dateikopf kodiert. Es gibt viele Beispiele hier . Selbst wenn Sie den Header lesen , können Sie jedoch nie sicher sein, welche Codierung eine Datei tatsächlich verwendet .

Zum Beispiel wird eine Datei mit den ersten drei Bytes 0xEF,0xBB,0xBFist wahrscheinlich eine UTF-8 - codierte Datei. Möglicherweise handelt es sich jedoch um eine ISO-8859-1-Datei, die mit den Zeichen beginnt . Oder es könnte ein ganz anderer Dateityp sein.

Notepad ++ gibt sein Bestes, um zu erraten, welche Codierung eine Datei verwendet, und meistens, wenn sie es richtig macht. Manchmal ist es jedoch falsch - deshalb gibt es das Menü "Codierung", damit Sie die beste Annahme überschreiben können.

Für die beiden Codierungen, die Sie erwähnen:

  • Die „UCS-2 Little Endian“ Dateien sind UTF-16 - Dateien (basierend auf , was ich von der Info verstehen hier ) so wahrscheinlich mit beginnen , 0xFF,0xFEals die ersten 2 Bytes. Nach allem, was ich sagen kann, beschreibt Notepad ++ sie als "UCS-2", da es bestimmte Facetten von UTF-16 nicht unterstützt.
  • Die "UTF-8 ohne Stückliste" -Dateien haben keine Header-Bytes. Das bedeutet das Bit "ohne Stückliste".
vaughandroid
quelle
2
Warum wird eine Datei, die mit einer Stückliste beginnt, automatisch als "UTF-8 ohne Stückliste" erkannt?
Michael Borgwardt
2
Und wenn eine Datei mit 0xFF, 0xFE gestartet wird, sollte sie automatisch als UTF-16 erkannt werden, nicht als UCS-2. UCS-2 wird wahrscheinlich geraten, weil es hauptsächlich ASCII-Zeichen enthält und somit jedes zweite Byte null ist.
Michael Borgwardt
2
Leider können mit der Erfahrung auch Metadaten („Header“) falsch sein. Die Datenbank, in der sich die Informationen befinden, ist möglicherweise beschädigt, oder der ursprüngliche Uploader hat dies falsch angegeben. (Dies war in den letzten Monaten ein erhebliches Problem für uns. Einige Daten wurden als "UTF-8" hochgeladen, mit der Ausnahme, dass sie "wirklich ISO8859-1" lauten, da sie wirklich gleich sind ?!) Bah! Wissenschaftler sollten behalten werden weg von der Entstehung von Metadaten, sie verstehen es einfach falsch ...)
Donal Fellows
1
Eigentlich finde ich es "witzig", dass das Codierungsproblem 2014 immer noch besteht, da keine Datei der Welt mit "ï» ¿"beginnt, und ich bin sehr überrascht, wenn ich eine HTML-Seite sehe, die mit der falschen Codierung geladen wurde. Es ist eine Frage der Wahrscheinlichkeit. Es ist undenkbar, die falsche Codierung zu wählen, wenn eine andere Codierung merkwürdige Zeichen vermeiden würde. Wenn Sie nach einer Codierung suchen, die merkwürdige Zeichen vermeidet, funktioniert dies vermutlich in 99,9999% der Fälle. Aber noch gibt es Fehler .. Auch ist es eine sehr verwirrende Botschaft ascii statt UTF8 zu verwenden um Speicherplatz zu sparen .. es ist verwirrend Junior-Entwickler diese Idee durchführen ..
Revious
18

Du kannst nicht. Wenn Sie das tun könnten, gäbe es nicht so viele Websites oder Textdateien mit „zufälligem Kauderwelsch“. Aus diesem Grund wird die Codierung normalerweise zusammen mit der Nutzlast als Metadaten gesendet.

Falls dies nicht der Fall ist, können Sie nur eine „kluge Vermutung“ durchführen. Das Ergebnis ist jedoch häufig mehrdeutig, da dieselbe Byte-Sequenz möglicherweise in mehreren Codierungen gültig ist.

Marco
quelle
2
OK, speichert das Windows-Betriebssystem diese Informationen (Metadaten) tatsächlich irgendwo? In der Registrierung wahrscheinlich?
Marcel
Du liegst falsch. Das sind Codepages - nicht ganz dasselbe. Bei der Unicode-Codierung sind Algorithmen zu erraten.
DeadMG
6
@Marcel: Nein. Deshalb sind "Textdateien" für alles andere als reines ASCII so problematisch.
Michael Borgwardt
Nun, Notepad ++ kann dies tun, es kann Ihnen sagen, ob die Textdatei utf-8-codiert ist oder nicht
user25