Ich habe eine Datei, die ich (in vim) zu Testzwecken erstellt habe (Testen der UTF-8-Ausgabe in einem SSH-Client). Mit dieser Datei passieren jedoch seltsame Dinge.
Ich habe mich gefragt, welche Bytes in der Datei sind, also habe ich hexdump
verwendet :
[email protected]:~$ hexdump -x intl.txt
0000000 9ecf 000a
0000003
Ok, da sind vier Bytes drin, wie die 00 und die 0a da reingekommen sind, ist mir nicht klar, aber egal. Hier wird es jedoch seltsam:
[email protected]:~$ ls -al intl.txt
-rw-rw-r-- 1 username username 3 Mar 26 15:14 intl.txt
Warte, es sind drei Bytes? Was ist hier los?
Als ob das nicht seltsam genug wäre, hexdump -C
gibt sehr unterschiedliche Ausgabe:
[email protected]:~$ hexdump -C intl.txt
00000000 cf 9e 0a |...|
00000003
Vim ist auch etwas verwirrt über die Datei. Wenn ich es starte, steht in der Statuszeile:
"intl.txt" 1L, 3C
Ganz oben bekomme ich dies jedoch (mithilfe von set list
):
Ϟ$
~
~
~
~
Es denkt also, dass es 3 Zeichen gibt, druckt aber nur eines. Ich könnte es verstehen, wenn es die Koppa und eine Leerzeile darunter drucken würde…
Akzeptierte Antwort:
Wie andere darauf hingewiesen haben, liegt dies daran, dass hexdump -x
behandelt die Dateien so, als ob sie 2-Byte-Wörter enthalten. Auf Little-Endian-Systemen (fast alle Desktops) bedeutet dies, dass die Bytes ausgetauscht werden, bevor sie angezeigt werden. Das bedeutet, dass die Bytewerte paarweise gedruckt werden und dass die Reihenfolge dieser Bytes vertauscht wird. Da Sie eine ungerade Anzahl von Bytes haben, hexdump
fügt einfach eine Null hinzu, um das letzte Paar zu bilden. Die Null wird dann mit dem 0a
vertauscht . Dies ist ein dokumentiertes Verhalten für hexdump
, also lügt es dich nicht an!
Mit hexdump -C
ist ein besserer Befehl, um eine formatierte Ausgabe zu erhalten, die die Bytes in der Reihenfolge anzeigt, in der sie sich in der Datei befinden. Auch die 0a
ist eine neue Zeile und wurde wahrscheinlich stillschweigend hinzugefügt, von dem, was auch immer die Datei erstellt hat (vim
tut dies standardmäßig). ZB echo
fügt immer eine neue Zeile hinzu, wenn Sie es nicht sagen. In bash
:
echo -e '\xcf\x9e' | hexdump -C
wird dasselbe Ergebnis liefern, aber den Zeilenumbruch mit -n
unterdrücken geben, was Sie erwartet haben:
echo -ne '\xcf\x9e' | hexdump -C
Um vim
zu stoppen vom Hinzufügen des Zeilenumbruchs:
:set noeol
:set binary