Saya memiliki file yang saya buat (dalam vim), untuk tujuan pengujian (menguji keluaran UTF-8 di klien SSH). Namun, hal-hal aneh terjadi pada file ini.
Saya bertanya-tanya berapa byte yang ada di file, jadi saya menggunakan hexdump
:
[email protected]:~$ hexdump -x intl.txt
0000000 9ecf 000a
0000003
Ok, ada empat byte di sana, Bagaimana 00 dan 0a masuk ke sana, saya tidak jelas, tapi terserah. Namun, di sinilah letak keanehannya:
[email protected]:~$ ls -al intl.txt
-rw-rw-r-- 1 username username 3 Mar 26 15:14 intl.txt
Tunggu, ini tiga byte? Apa yang terjadi di sini?
Seolah itu tidak cukup aneh, hexdump -C
memberikan keluaran yang sangat berbeda:
[email protected]:~$ hexdump -C intl.txt
00000000 cf 9e 0a |...|
00000003
Vim juga agak bingung dengan filenya. Ketika saya memulainya, ini memberikan ini di baris status:
"intl.txt" 1L, 3C
Namun, di bagian atas, saya mendapatkan ini (menggunakan set list
):
Ϟ$
~
~
~
~
Jadi, dianggap ada 3 karakter, tetapi hanya mencetak satu. Saya bisa mengerti jika itu mencetak koppa dan garis kosong di bawahnya…
Jawaban yang Diterima:
Seperti yang telah ditunjukkan orang lain, ini karena hexdump -x
memperlakukan file sebagai berisi kata-kata 2-byte. Pada sistem little endian (hampir semua desktop), ini berarti byte akan ditukar sebelum ditampilkan. Ini berarti bahwa nilai byte dicetak berpasangan dan urutan byte ini ditukar. Karena Anda memiliki jumlah byte ganjil, hexdump
hanya menambahkan nol untuk membuat pasangan terakhir. Angka nol kemudian ditukar dengan 0a
. Ini adalah perilaku yang didokumentasikan untuk hexdump
, jadi itu tidak membohongi Anda!
Menggunakan hexdump -C
adalah perintah yang lebih baik untuk mendapatkan output berformat yang menunjukkan byte sesuai urutannya dalam file. Juga 0a
adalah baris baru dan mungkin ditambahkan secara diam-diam oleh apa pun yang membuat file tersebut (vim
melakukan ini secara default). Misalnya, echo
akan selalu menambahkan baris baru jika Anda tidak melarangnya. Di bash
:
echo -e '\xcf\x9e' | hexdump -C
akan memberikan hasil yang sama, tetapi menekan baris baru dengan -n
akan memberikan apa yang Anda harapkan:
echo -ne '\xcf\x9e' | hexdump -C
Untuk menghentikan vim
dari menambahkan baris baru:
:set noeol
:set binary