vim显示^@是什么意思啊?

我是在windows下用的vim,打开的是一个注册表的*.reg文件 [图片]
关注者
29
被浏览
38,031
登录后你可以
不限量看优质回答 私信答主深度交流 精彩内容一键收藏

- = 额……

首先,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. & 谢邀请。