テスト目的で(SSHクライアントからUTF-8出力をテストするために)ファイルを(vimで)作成しました。しかし、このファイルに奇妙なことが起こります。
ファイルにどのバイトがあるかを知りたかったので、次のようにしましたhexdump
。
username@computername:~$ hexdump -x intl.txt
0000000 9ecf 000a
0000003
まあ、そこには4バイトがあります。どのように00と0aがそこに入ってきたのか分からないが、とにかく言葉です。しかし、奇妙なことは次のとおりです。
username@computername:~$ ls -al intl.txt
-rw-rw-r-- 1 username username 3 Mar 26 15:14 intl.txt
待って、3バイトですか?ここで何が起こっているのでしょうか?
これは十分に奇妙ではないように、hexdump -C
非常に異なる結果を提供します。
username@computername:~$ hexdump -C intl.txt
00000000 cf 9e 0a |...|
00000003
Vimもこのファイルについて少し混乱しています。起動すると、ステータス行に次のように表示されます。
"intl.txt" 1L, 3C
ただし、一番上には次の内容が表示されます(使用set list
)。
Ϟ$
~
~
~
~
したがって、3つの文字があると思いますが、1つだけを印刷します。 koppaとその下に空白行が印刷されているとわかります...
ベストアンサー1
他の人が指摘したように、これはファイルがhexdump -x
2バイトの単語を含むと見なされるためです。存在するリトルエンディアンシステム(ほとんどのデスクトップがそうです)。これは、表示される前にバイトが交換されることを意味します。これは、バイト値がペアで印刷され、これらのバイトの順序が変わることを意味します。バイト数が奇数なので、hexdump
ゼロを追加して最終ペアを作成します。次に0を0a
。これは文書化された動作hexdump
なので、嘘をつくのではありません!
より良いコマンドは、hexdump -C
ファイルに表示される順序でバイトを表示する形式化された出力を取得することです。また、これは0a
ファイルを作成した人が自動的に追加した可能性がある新しい行です(vim
デフォルトではこれを行います)。たとえば、echo
これを行わないように指示しないと、常に新しい行が追加されます。存在するbash
:
echo -e '\xcf\x9e' | hexdump -C
同じ結果が得られますが、改行を抑えることで-n
期待した結果が得られます。
echo -ne '\xcf\x9e' | hexdump -C
改行の追加を停止するには、次の手順を実行しますvim
。
:set noeol
:set binary