有的时候使用gvim查看文本文件时,出现乱码,现在来确定下原因。
经过我的查资料,发现gvim里有几个关于编码设置的变量:encoding、fileencoding、fileencodings、termencoding。
我很纳闷,为什么要有这么几个关于编码的设置,一个不就行了??
encoding:vim内部使用的字符编码方式,包括vim的buffer、菜单文件、消息文本等。
fileencoding:vim当前编辑的文件的字符编码方式,vim保存文件时也会将文件保存为这种字符编码方式。
filesencoding:vim自动探测fileencoding的顺序列表,启动时会按照它所列出的字符编码方式逐一探测即将打开的文件字符编码方式,并且将fileencoding设置为最终探测到的字符编码方式。
Windows 7下创建一个txt,使用gvim打开,默认的设置为:
termencoding=
encoding=cp936
fileencoding=
fileencodings=ucs-bom
按照帮助内容说,当termencoding值为空时,取值与encoding一样;当fileencoding值为空时,也与encoding一样。
来个例子:
1.新建一个文件后,查看编码设置如下:
termencoding=
encoding=cp936
fileencoding=
fileencodings=ucs-bom
2.set fenc=utf-8,然后写入中文字符“编码”,保存并退出,使用二进制编辑器查看文件
很明显,文件保存的格式为utf-8
3.重新打开文件,结果如下,竟然乱码啦
4.为什么呢?
查看编码设置,结果如下:
termencoding=
encoding=cp936
fileencoding=
fileencodings=ucs-bom
我想在这里讲一些vim启动时编码设置的知识,首先根据vim配置文件设置各个变量的值,其次,如果encoding和fileencoding不相同,则对文件中的文字进行编码转换然后放入vim buffer中,然后进行显示。在这里呢,因为fileencoding为空,所以默认等于encoding,也就没有对文件中的文字进行编码转换就进行显示,所以出现了乱码。如果在vimrc中设置了fileencoding=utf-8后,我想就不会出现乱码了。
因为encoding=cp936,即vim buffer的编码方式是cp936,但是实际上buffer里的文字的编码方式为utf-8(没有将utf-8转换为cp936),所以出现乱码
5.怎么解决呢?
使用set enc=utf-8,文本即可显示正常,如下图
6.为什么通过set enc=utf-8就可以解决问题呢?
设置了enc=utf-8后,vim buffer的编码方式被设置为utf-8,因此和文件的真正编码一样了,正确显示