gotowqj 2011-07-07
setencoding=utf8
Vim可以很好的编辑各种字符编码的文件,包括UCS-2、UTF-8等流行的Unicode编码方式:
Vim有四个跟字符编码方式有关的选项,encoding、fileencoding、fileencodings、termencoding,它们的意义如下:
*encoding:Vim内部使用的字符编码方式,包括Vim的buffer(缓冲区)、菜单文本、消息文本等;
*fileencoding:Vim中当前编辑的文件的字符编码方式,Vim保存文件时也会将文件保存为这种字符编码方式(不管是否新文件都如此);
*fileencodings:Vim启动时会按照它所列出的字符编码方式逐一探测即将打开的文件的字符编码方式,并且将fileencoding设置为最终探测到的字符编码方式。因此最好将Unicode编码方式放到这个列表的最前面,将拉丁语系编码方式latin1放到最后面;
*termencoding:Vim所工作的终端(或者Windows的Console窗口)的字符编码方式。
Vim的多字符编码的工作方式:
1.Vim启动,根据.vimrc中设置的encoding的值来设置buffer、菜单文本、消息文的字符编码方式;
2.读取需要编辑的文件,根据fileencodings中列出的字符编码方式逐一探测该文件编码方式。并设置fileencoding为探测到的,看起来是正确的(注1)字符编码方式;
3.对比fileencoding和encoding的值,若不同则调用iconv将文件内容转换为encoding所描述的字符编码方式,并且把转换后的内容放到为此文件开辟的buffer里,此时我们就可以开始编辑这个文件了。注意,完成这一步动作需要调用外部的iconv.dll(注2),你需要保证这个文件存在于$VIMRUNTIME或者其他列在PATH环境变量中的目录里;
4.编辑完成后保存文件时,再次对比fileencoding和encoding的值。若不同,再次调用iconv将即将保存的buffer中的文本转换为fileencoding所描述的字符编码方式,并保存到指定的文件中。同样,这需要调用iconv.dll。
由于Unicode能够包含几乎所有的语言的字符,而且Unicode的UTF-8编码方式又是非常具有性价比的编码方式(空间消耗比UCS-2小),因此建议encoding的值设置为utf-8。这么做的另一个理由是encoding设置为utf-8时,Vim自动探测文件的编码方式会更准确(或许这个理由才是主要的;)。我们在中文Windows里编辑的文件,为了兼顾与其他软件的兼容性,文件编码还是设置为GB2312/GBK比较合适,因此fileencoding建议设置为chinese(chinese是个别名,在Unix里表示gb2312,在Windows里表示cp936,也就是GBK的代码页)。
注1:事实上,Vim的探测准确度并不高,尤其是在encoding没有设置为utf-8时。因此强烈建议将encoding设置为utf-8,虽然如果你想Vim显示中文菜单和提示消息的话这样会带来另一个小问题。
注2:在GNU的FTP上可以下载到iconv的Win32版(http://mirrors.kernel.org/gnu/libiconv/libiconv-1.9.1.bin.woe32.zip)。
注3:查看帮助:hiconv-dynamic。
注4:前方中提到的.vimrc在windows下为_vimrc,存在于vim安装目录下。
以下为在windows下gvim7.2地配置文件_vimrc,使用此配置可解决安装中文版vimdoc后出现的菜单、控制台信息等乱码现象。
setencoding=utf-8
setfileencodings=utf-8,chinese,latin-1
ifhas("win32")
setfileencoding=chinese
else
setfileencoding=utf-8
endif
source$VIMRUNTIME/delmenu.vim
source$VIMRUNTIME/menu.vim
languagemessageszh_CN.utf-8
" \ \ / /_ | / | _ \ / | / / _ | \ | | | / |. " \ \ / / | || |/| | |) | | | | | | | | | | | | | | _.