Ich versuche, ein seltsames Zeichen zu identifizieren, das ich in einer Datei gefunden habe, mit der ich arbeite:
$ cat file
�
$ od file
0000000 005353
0000002
$ od -c file
0000000 353 \n
0000002
$ od -x file
0000000 0aeb
0000002
Die Datei verwendet die ISO-8859-Codierung und kann nicht in UTF-8 konvertiert werden:
$ iconv -f ISO-8859 -t UTF-8 file
iconv: conversion from `ISO-8859' is not supported
Try `iconv --help' or `iconv --usage' for more information.
$ iconv -t UTF-8 file
iconv: illegal input sequence at position 0
$ file file
file: ISO-8859 text
Meine Hauptfrage ist, wie ich die Ausgabe von od
hier interpretieren kann . Ich versuche, diese Seite zu verwenden, auf der ich zwischen verschiedenen Zeichendarstellungen übersetzen kann, aber sie sagt mir, dass 005353
ein "Hex-Code-Punkt" 卓
nicht richtig und 0aeb
ein "Hex-Code-Punkt" ૫
wiederum falsch erscheint .
Also, wie kann ich eine der drei Optionen verwenden ( 355
, 005353
oder 0aeb
) , um herauszufinden , was Charakter , den sie darstellen soll?
Und ja, ich habe es mit Unicode-Tools versucht, aber es scheint auch kein gültiges UTF-Zeichen zu sein:
$ uniprops $(cat file)
U+FFFD ‹�› \N{REPLACEMENT CHARACTER}
\pS \p{So}
All Any Assigned Common Zyyy So S Gr_Base Grapheme_Base Graph X_POSIX_Graph
GrBase Other_Symbol Print X_POSIX_Print Symbol Specials Unicode
Wenn ich die Beschreibung des Unicode U + FFFD-Zeichens verstehe, ist es überhaupt kein echtes Zeichen, sondern ein Platzhalter für ein beschädigtes Zeichen. Dies ist sinnvoll, da die Datei nicht UTF-8-codiert ist.
quelle
iconv
beschwert sich, weil Sie den Quellzeichensatz nicht angegeben haben, daher wird Ihr Standard verwendet, der wahrscheinlich UTF-8 ist.)ë
das sehe ich, wenn die Daten in einem anderen Programm verwendet werden! Aber wie kann ich das wissen? Ist es nicht irgendwo in den Daten, die ich zur Verfügung stelle? Wie hast du das gefunden? Oh, ich hatte esiconv
mit versucht,-f ISO-8859
aber es beschwerte sich überconversion from
ISO-8859 "wird nicht unterstützt".eb
den0x
Hex-Indikator oder was auch immer das verwenden und ignorieren . Meine Unkenntnis dieser Art von Dingen ist tief. Könnten Sie eine Antwort posten, die erklärt, dass @StephenKitt?iconv
wäre es dir gelungen; und / oder du hättest es zB bei Wikipedia nachschlagen können. Für diese sehr spezifische Codierung funktioniert auch fileformat.info/info/unicode/char/00eb/index.htm (Unicode entspricht ISO-8859-1 im Bereich von 128-255, obwohl natürlich keine UTF-Codierung damit kompatibel ist ).Antworten:
Ihre Datei enthält zwei Bytes, EB und 0A in hex. Es ist wahrscheinlich, dass die Datei einen Zeichensatz mit einem Byte pro Zeichen verwendet, z. B. ISO-8859-1 . In diesem Zeichensatz ist EB ë:
Andere Kandidaten wären δ in Codepage 437 , Ù in Codepage 850 ...
od -x
Die Ausgabe ist in diesem Fall wegen der Endianness verwirrend. Eine bessere Option ist-t x1
die Verwendung einzelner Bytes:od -x
Zuordnungen, zuod -t x2
denen zwei Bytes gleichzeitig gelesen werden, und auf Little-Endian-Systemen werden die Bytes in umgekehrter Reihenfolge ausgegeben.Wenn Sie auf eine solche Datei stoßen, die kein gültiges UTF-8 ist (oder bei der Interpretation als UTF-8-Datei keinen Sinn ergibt), gibt es keine narrensichere Möglichkeit, die Codierung (und den Zeichensatz) automatisch zu bestimmen. Der Kontext kann helfen: Wenn es sich um eine Datei handelt, die in den letzten Jahrzehnten auf einem westlichen PC erstellt wurde, besteht eine gute Chance, dass sie in ISO-8859-1, -15 (Euro-Variante) oder Windows-1252 codiert ist. Wenn es älter ist, sind CP-437 und CP-850 wahrscheinlich Kandidaten. Dateien aus osteuropäischen oder russischen oder asiatischen Systemen würden unterschiedliche Zeichensätze verwenden, über die ich nicht viel weiß. Dann gibt es EBCDIC ...
iconv -l
listet alle Zeichensätze auf, die Sieiconv
kennen, und Sie können von dort aus durch Ausprobieren fortfahren.(Irgendwann wusste ich, dass die meisten CP-437 und ATASCII auswendig konnten, das waren die Tage.)
quelle
ë
dies als00EB
und beschrieben wird234
. Was sind das extra00
? Und warum ist es nicht so,355
wie ich es von derod
Ausgabe erwartet habe ? Ich versuche eine allgemeinere Antwort darauf zu bekommen, wie ich dieod
Ausgabe verwenden kann, um den Charakter zu identifizieren. Könnten Sie vielleicht etwas über die Interpretation von Hex-Codes erklären und / oder welche Informationen benötigt werden, um ein unbekanntes Zeichen identifizieren zu können (Codierung und was auch immer)?353
. Der 353 ist also eine oktale Darstellung, keine Dezimalzahl. Argh.od
steht für oktal ;-).�
(U + FFFD) vom Terminalemulator als Ersatz für das 0xeb-Byte angezeigt, das in UTF-8 kein gültiges Zeichen bildet. Es ist nicht klar, warumuniprops $(cat file)
(übrigens fehlende Anführungszeichen) dies melden würden (ich weiß nichts über diesenuniprops
Befehl).unicode "$(cat file)"
auf Debian wirdSequence '\xeb' is not valid in charset 'UTF-8'
wie erwartet ausgegeben .Beachten Sie, dass die
od
Abkürzung für ist Oktal - Dump , so005353
sind die beiden Bytes als Oktalwortes,od -x
ist0aeb
in Hexadezimal als Wort, und die tatsächlichen Inhalte der Datei sind die beiden Byteseb
und0a
in hexadezimal, in dieser Reihenfolge.Also beides
005353
und0aeb
kann nicht einfach als "Hex-Code-Punkt" interpretiert werden.0a
ist ein Zeilenvorschub (LF) undeb
hängt von Ihrer Codierung ab.file
errät nur die Kodierung, es könnte alles sein. Ohne weitere Informationen, woher die Datei stammt usw. wird es schwierig sein, dies herauszufinden.quelle
od -c
da dies eine Ausgabe erzeugt, die ich verstehen kann. Wie hätte ich das verwenden können355
, um den Charakter zu identifizieren? Und warum wird gedruckt,0aeb
anstatteb0a
ob0a
es sich um die neue Zeile handelt?Es ist unmöglich, den Zeichensatz von Textdateien mit 100% iger Genauigkeit zu erraten.
Tools wie Chardet , Firefox , Datei -i, wenn keine expliziten Zeichensatzinformationen definiert sind (z. B. wenn ein HTML einen Meta-Zeichensatz enthält = ... im Kopf, sind die Dinge einfacher), versuchen, Heuristiken zu verwenden, die nicht so schlecht sind, wenn Der Text ist groß genug.
Im Folgenden demonstriere ich die Zeichensatzerkennung mit
chardet
(pip install chardet
/apt-get install python-chardet
falls erforderlich).Nachdem Kandidaten gut charset, können wir verwenden
iconv
,recode
oder ähnlich , die Datei charset zu Ihrem „aktiv“ charset zu ändern (in meinem Fall utf-8) und sehen , ob es richtig geraten ...Einige Zeichensätze (wie iso-8859-3, iso-8859-1) haben viele Zeichen gemeinsam - manchmal ist es nicht leicht zu erkennen, ob wir den perfekten Zeichensatz gefunden haben ...
Daher ist es sehr wichtig, Metadaten mit relevantem Text (z. B. XML) verknüpft zu haben.
quelle
iconv -f ... -t utf-8
werden Sie die Zeichen zeigen?iso-8850-1
. iso-8859 ist ein iso-Standard, der mehrere Chaset-Definitionen enthält. Versuchen Siefile -i ...
iconv -f ISO-8859-1 -t UTF-8 file
Wenn ich eine Datei bekomme, die zum Beispiel das Wort Begrung enthält, kann ich daraus schließen, dass Begrüßung gemeint sein könnte. Also konvertiere ich es durch alle bekannten Codierungen und schaue, ob eine gefunden wird, die es richtig konvertiert.
Normalerweise gibt es mehrere Codierungen, die zu passen scheinen.
Bei längeren Dateien können Sie ein Snippet ausschneiden, anstatt Hunderte von Seiten zu konvertieren.
Also würde ich es nennen
und das Skript testet, ob durch Konvertieren mit den bekannten Codierungen, die von ihnen "Begrüßung" erzeugen.
Um solche Charaktere zu finden, hilft normalerweise weniger, da funky Charaktere oft auffallen. Aus dem Kontext kann normalerweise das richtige Wort abgeleitet werden, nach dem gesucht werden soll. Wir möchten jedoch nicht mit einem Hexeditor überprüfen, um welches Byte es sich handelt, und dann endlose Codierungstabellen besuchen, um unseren Täter zu finden. :) :)
quelle