[英]What does '^@' mean in vim?
當我在bash中捕獲文件時,我得到以下內容:
$ cat /tmp/file
microsoft
當我在vim中查看同一個文件時,我得到以下內容:
^@m^@i^@c^@r^@o^@s^@o^@f^@t^@
如何識別和刪除這些“不可打印”的字符。 什么'^ @'在vim中意味着什么?
(只是一個背景信息:該文件是由base 64解碼並從Microsoft Playready的mpd文件的pssh頭切割而創建的)
你看到的是Vim對不可打印角色的直觀表現。 它解釋為:help 'isprint'
:
Non-printable characters are displayed with two characters: 0 - 31 "^@" - "^_" 32 - 126 always single characters 127 "^?" 128 - 159 "~@" - "~_" 160 - 254 "| " - "|~" 255 "~?"
因此, ^@
代表空字節 = 0x00。 這些(和其他不可打印的字符)可以來自各種來源,但在你的情況下它是......
如果你在Vim中清楚地觀察你的輸出,那么每個第二個字節都是一個空字節 ; 中間是預期的字符。 這清楚地表明該文件使用多字節編碼 ( utf-16
,big endian,沒有精確的字節順序標記),並且Vim沒有正確檢測到它,而是將文件打開為latin1
左右(而事情有效)在終端正確地出去)。
要解決此問題,您可以顯式指定編碼:
:edit ++enc=utf-16 /tmp/file
或者調整'fileencodings'
選項,以便Vim可以自動檢測到這一點。 但是,請注意,模糊(如在您的情況下)使這容易失敗:
對於空文件或僅包含ASCII字符的文件,大多數編碼都可以使用,並且將使用'fileencodings'的第一個條目(“ucs-bom”除外,這需要BOM存在)。
這就是為什么建議16位編碼使用字節順序標記 (BOM); 但這假設您可以控制輸出編碼。
^@
是Vim表示空字節。 ^
表示不可打印的控制字符,下面的ASCII字符表示它是哪個控制字符。
^@ == 0 (NUL)
^A == 1
^B == 2
...
^H == 8
^K == 11
...
^Z == 26
^[ == 27
^\ == 28
^] == 29
^^ == 30
^_ == 31
^? == 127
9和10不會被轉義,因為它們分別是制表符和換行符。
32到126是可打印的ASCII字符(以Space開頭)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.