(3)fileencoding
当Vim从磁盘上读取文件的时候,会对文件的编码进行探测。如果文件的编码方式和Vim的内部编码方式不同,Vim就会对编码进行转换。转换完毕后,Vim会将fileencoding选项设置为文件的编码。当Vim存盘的时候,如果encoding和fileencoding不一样,Vim就会进行编码转换。因此,通过打开文件后设置fileencoding,我们可以将文件由一种编码转换为另一种编码。但是,由前面的介绍可以看出,fileencoding是在打开文件的时候,由Vim进行探测后自动设置的。因此,如果出现乱码,我们无法通过在打开文件后重新设置fileencoding来纠正乱码。
简而言之,fileencoding是Vim中当前编辑的文件的字符编码方式,Vim保存文件时也会将文件保存为这种字符编码方式 (不管是否新文件都如此)。
(4)fileencodings
编码的自动识别是通过设置fileencodings实现的,注意是复数形式。fileencodings是一个用逗号分隔的列表,列表中的每一项是一种编码的名称。当我们打开文件的时候,VIM按顺序使用fileencodings中的编码进行尝试解码,如果成功的话,就使用该编码方式进行解码,并将fileencoding设置为这个值,如果失败的话,就继续试验下一个编码。
因此,我们在设置fileencodings的时候,一定要把要求严格的、当文件不是这个编码的时候更容易出现解码失败的编码方式放在前面,把宽松的编码方式放在后面。例如,latin1是一种非常宽松的编码方式,任何一种编码方式得到的文本,用latin1进行解码,都不会发生解码失败——当然,解码得到的结果自然也就是理所当然的“乱码”。因此,如果你把latin1放到了fileencodings的第一位的话,打开任何中文文件都是乱码也就是理所当然的了。
以下是网上推荐的一个fileencodings设置:
set fileencodings=ucs-bom,utf-8,cp936,gb18030,big5,euc-jp,euc-kr,latin1
其中,ucs-bom是一种非常严格的编码,非该编码的文件几乎没有可能被误判为ucs-bom,因此放在第一位。
utf-8也相当严格,除了很短的文件外(例如许多人津津乐道的GBK编码的“联通”被误判为UTF-8编码的经典错误),现实生活中一般文件是几乎不可能被误判的,因此放在第二位。
接下来是cp936和gb18030,这两种编码相对宽松,如果放前面的话,会出现大量误判,所以就让它们靠后一些。cp936的编码空间比gb18030小,所以把cp936放在gb18030前面。