標籤:

vim顯示^@是什麼意思啊?

我是在windows下用的vim,打開的是一個註冊表的*.reg文件


- = 額……

首先,ASCII 碼錶示的字元不都是可列印字元(可顯示字元),意味著,其中的控制字元本不是對應某個字形的,所以本沒有辦法看到他們。

那麼如果萬一某個文件中出現了這些怎麼辦捏??

這裡我們需要再了解下啥叫「純文本文件」。這個概念我們經常見,但其實現在已經被各種濫用。通俗講,應該是主要由可見字元組成的文件,比如純 ASCII 可見字元、Unicode 非控制字元等……這個概念針對的是「二進位文件」,即任何二進位序列的位元組都可能存在的文件。

然後「純文本編輯器」就是用來對付純文本文件的編輯器,由於字元大多可見,只需要按字元對應的字形顯示出來,大家就知道它是誰了。那如果萬一有個文件,裡面的某個編碼位置在字體中沒有字形咋辦?

javascript:;

這個問題,取決於編輯器的作者決定怎麼辦,——比如,跳過去不管,比如顯示個問號或者別的啥,又比如想辦法把編碼顯示出來。

Vim 選擇了一種很帥氣的解決方案:

ASCII 0-31 部分的所有字元,將編碼加上 64 之後對應的全部為可列印字元,於是將 0-31 位置的字元,用 ^ 跟轉換之後對應的那個字元綁在一起當作一個字元顯示出來,既簡潔又實用,——是為「脫字元表示法」。

例如,0x00 對應 ^@ (0+64),0x0D(回車)對應 ^M (13+64)……

BTW,脫字元表示法還剛好對應了 Vim 的另幾個霸氣的功能:i_Ctrl-V 之後將插入鍵的「本意」。比如 i_Ctrl-V 之後按回車,你將得到 ASCII 字元 0x0D,——既顯示為 ^M 的那個東東。再來一個,i_Ctrl-V 之後 Ctrl-@,你將得到 ASCII 字元 NUL……所以作為一個霸氣側漏的文本編輯器,Vim 可以讓你有機會顯示、輸入非列印字元(see :h i_Ctrl-V, :h i_Ctrl-V_digit, :h i_Ctrl-K),是不是很爽?

最後,關於那個 reg 文件。Windows 下有個很蛋疼的編碼叫 Unicode 16,就是每兩個位元組表示一個字元。這個編碼之所以蛋疼就是,如果只有 ASCII 字元,文件會比本該的大小大一倍;更蛋疼的是,這個格式不好做編碼檢測,很多文本編輯器對這個的支持不好。如果你用記事本打開,或者直接在 cmd 裡面 type,都能輕鬆看懂裡面是啥;可是文件裡面明明應該是 0x41 的字元,卻成了 0x0041 或者 0x4100,我們 Vim 就只好把多出來的那個位元組 0x00 顯示成 ^@ 了……

Fin. 謝邀請。


推薦閱讀:

Vim 和 Emacs 都用過兩年以上的人,說說它們使用起來感覺最大的區別是什麼?
你用vim還是xcode寫iPhone程序代碼?
為什麼在 vi 的世界, 拷貝都使用 yank 這個詞, 而不是 copy?

TAG:Vim |