Ich habe eine UTF-8-Datei, die ein seltsames Zeichen enthält - für mich genauso sichtbar
<96>
So erscheint es auf vi
und wie es auf erscheint gedit
und wie es unter LibreOffice erscheint
und das führt dazu, dass sich eine Reihe grundlegender Unix-Tools schlecht verhält, darunter:
cat file
Lass den Charakter verschwinden undmore
auch- Ich kann nicht in vi / vim kopieren und einfügen - es wird sich nicht einmal selbst finden
grep
zeigt auch nichts an, als ob das Zeichen nicht existiert hätte.
Das Programm file
funktioniert einwandfrei und erkennt eine UTF-8-Datei. Ich weiß auch, dass die Datei aufgrund der Art höchstwahrscheinlich aus einem Copy & Paste aus dem Web stammt und das Zeichen ursprünglich einen EMDASH darstellte.
Meine grundlegenden Fragen sind:
- Stimmt etwas mit dieser Datei nicht?
- Wie kann ich in derselben Datei nach anderen Vorkommen suchen?
- Wie kann ich nach anderen Dateien suchen, die möglicherweise dasselbe Problem / denselben Charakter enthalten?
Die Datei finden Sie hier: file.txt
unicode
character-encoding
Paulo Ney
quelle
quelle
hexdump -C filename
, die Kodierung dessen zu betrachten, was für Sie als "sichtbar" ist<96>
. Der Kontext sollte helfen, ihn genau zu bestimmen.hexdump -C
zeigtc2 96
. Wie kann ich nach anderen Vorkommen derselben Sache suchen?gedit
wenn Sie ihn so eingestellt haben, dass er Ihre Sprache und UTF-8 verwaltet. In diesem Fall können Sie dieses Zeichen entfernen.Antworten:
Diese Datei enthält Bytes
C2 96
, die die UTF-8- Codierung des Codepunkts U + 0096 darstellen. Dieser Codepunkt ist eines der C1-Steuerzeichen, die üblicherweise als SPA "Start of Guarded Area" (oder "Protected Area") bezeichnet werden. Das ist kein nützlicher Charakter für ein modernes System, aber es ist unwahrscheinlich, dass es dort schädlich ist.Die ursprüngliche Quelle hierfür war wahrscheinlich ein Byte 0x96 in einer Einzelbyte-8-Bit-Codierung, die irgendwo auf dem Weg falsch transkodiert wurde. Wahrscheinlich war dies ursprünglich ein Windows CP1252 mit Bindestrich "-", der in dieser Codierung den Bytewert 96 hat - bei den meisten anderen plausiblen Kandidaten ist die Steuerung auf die Positionen 80-9F eingestellt -, der in UTF-8 übersetzt wurde, als wäre er lateinisch. 1 ( ISO / IEC 8859-1 ), was nicht ungewöhnlich ist. Dies würde dazu führen, dass das Byte als Steuerzeichen interpretiert und entsprechend übersetzt wird, wie Sie gesehen haben.
Sie können diese Datei mit dem
iconv
Tool reparieren , das Teil von glibc ist.produziert eine korrekte Version Ihres minimalen Beispiels für mich. Dies funktioniert, indem zuerst UTF-8 in Latin-1 konvertiert wird (die frühere Fehlübersetzung wird invertiert) und dann als cp1252 neu interpretiert , um es wieder korrekt in UTF-8 zu konvertieren.
Es hängt jedoch davon ab, was sich sonst noch in der realen Datei befindet. Wenn Sie anderswo Zeichen außerhalb von Latin-1 haben, schlägt dies fehl, da diese im ersten Schritt nicht korrekt codiert werden können.
Wenn Sie kein iconv haben oder es für die reale Datei nicht funktioniert, können Sie die Bytes direkt mit sed ersetzen:
Dies wird
C2 96
durch die UTF-8-En-Dash-Codierung ersetztE2 80 93
. Man könnte es auch mit zB einem Bindestrich oder zwei ersetzen durch eine Änderung\xe2\x80\x93
in--
.Sie können auf ähnliche Weise grep. Wir verwenden
LC_ALL=C
, um sicherzustellen, dass wir die tatsächlichen Bytes lesen und keinegrep
Interpretationssachen haben:listet überall in diesem Verzeichnis diese Bytes auf. Sie können es auf Textdateien beschränken, wenn Sie gemischten Inhalt haben, da Binärdateien ziemlich oft ein beliebiges Bytepaar enthalten.
quelle
grep
?grep $'\xc2\x96'
(letzter Abschnitt).0x96 ist ein Bindestrich in der Windows-Codepage 1252. Das
c2
vorangestellte Byte scheint ein Standard-Erstbyte in einem Zeichen mit doppelter Breite zu sein. Jemand anderes könnte es genauer erklären.Um nach anderen Vorkommen zu suchen,
yl
bewegen Sie den Mauszeiger im Befehlsmodus darüber, drücken Sie (ziehen Sie ein Zeichen) und geben Sie ein/<Ctrl>+r"
. (Mit Strg + r können Sie den Inhalt eines Registers in den Befehl einfügen, und das"
Register ist das, was zuletzt gezogen wurde.)Ersetzen Sie es einfach durch zwei Bindestriche, wenn Sie möchten, dass es in Ihrem Terminal gerendert wird. Wenn es sich um eine Bibtex-Datei handelt, die Sie haben, sind zwei Bindestriche die geeignete Methode, um sie einzugeben.
Um zu zeigen, wie Sie Vorkommen des Charakters finden können, können Sie ihn durch ein Hexdump-Tool wie leiten
xxd
.quelle
grep
?xxd
. Siehe meine aktualisierte Antwort.Der Text in Ihrer Datei lautet
pages = {1113},
: Ja, es sieht aus wie die Nummer,1113
aber nach dem ersten steht tatsächlich ein anderes Zeichen1
. Und ja, Sie können die Zeichenfolge über den Bearbeitungslink für diese Webseite kopieren und einfügen, um das codierte Zeichen zu erhalten.Wir können mit einigen Werkzeugen in die Zeichenfolge schauen:
Oder um es explizit zu verdeutlichen und ein einfaches Kopieren und Einfügen zu ermöglichen, ohne die Bearbeitungsseite zu verwenden:
Das Zeichen besteht also aus zwei Byte-Werten
c2 96
(in Hex) oder302 226
(in Oktal).Es ist wahrscheinlich die UTF-8-Codierung eines Bytewerts von
96
oder ausgedrückt als Unicode-Zeichen :U-0096
.Dieser Wert, in der heutigen Zeit UTF-8 oder noch besser in ISO-8859-1, ist ein Steuerzeichen im C1-Bereich der Steuerzeichen ( Wikipedia-Seite ) und ( Unicode PDF ), das von 128 bis 159 in Dezimalzahl reicht. Insbesondere wird der U-0096 als "START OF GUARDED AREA" oder SPA bezeichnet .
Dieser Wert (Dez. 150) liegt außerhalb des ASCII-Bereichs (0-127) und wurde (in früheren Zeiten) verwendet, um abhängig von der verwendeten Codepage mehrere Zeichen darzustellen. Es scheint vernünftig anzunehmen, dass es sich zuvor um einen Bindestrich (um den Bereich 1-113 zu markieren) handelte, der in Windows-1252 ( Microsoft-Seite ) ( Wikipedia 1252 ) codiert und als en-Bindestrich bezeichnet wurde (der kleinere der beiden Bindestriche en und) em ) ( Wikipedia en dash ) oder einfach, in Laienbegriffen, ein Bindestrich (
-
).Q1: Stimmt etwas mit dieser Datei nicht?
Nicht wirklich, Steuerzeichen sind gültige Zeichen, die selten verwendet werden, aber trotzdem gültig sind.
Sie können sie jedoch durch einen Bindestrich ersetzen, um die Bearbeitung zu vereinfachen.
F2 - Wie kann ich in derselben Datei nach anderen Vorkommen suchen?
Oder grep könnte nach dem Zeichen suchen (die Hervorhebung der Farbe ist nicht sichtbar, da das Zeichen nicht druckbar ist) und die Zeile drucken.
Oder finden Sie alle Zeichen in diesem Steuerzeichenbereich und listen Sie die Dateien auf, die solche Zeichen enthalten:
F3 - Wie kann ich nach anderen Dateien suchen, die möglicherweise dasselbe Problem / denselben Charakter enthalten?
Dadurch werden
-l
die Dateien aufgelistet ( ), die dem Zeichen entsprechen.quelle