虽然VIM自7.0之后对双字节的编码已经支持的很不错了,但是,还是需要一些配置才能完全实现的哦。

要解决的问题:

1.识别双字节编码格式

需要先了解的知识:

vim中的内置变量:

enc(encoding):vim的内部编码

fenc(fileencoding):vim解析出来的当前文件编码(有可能解析成错的哦)

fencs(fileencodings):vim解析文件时猜测的编码格式顺序列表

需要的配置:

1.vimrc中的代码如下:

解释如下:

set encoding=utf-8这行是将vim的内部编码格式变为utf-8,这样vim识别文件正确的准确性会提高很多。set fenc=cp936是指当新建一个文件的时候,默认编码是gbk,而set fileencodings=cp936,ucs-bom,utf-8 这一行会让vim按照gbk,utf-8(没有头),utf-8的顺序识别。由于笔者的工作环境下大部分代码要求为gbk,所以才如上述设置,如果读者需要默认为utf-8格式,可以如下配置:

接下来:

这段代码是防止菜单乱码。

是为了让vim能够默认以双字节处理那些特殊字符。

set nobomb 是让vim不要自动设置字节序标记,因为并不是所有编辑器都可以识别字节序标记的。

2.由于即便配置了上述的代码,也不一定能够100%认识对编码,所以推荐大家安装一款插件,是国人写的,挺不错的。

fencview.vim

这款插件集成了自动检测编码格式的能力,但是笔者测试过似乎不是很准,所以还是建议关掉自动检测,只有在vim检测失败的时候,才调出fencview,手动选择编码比较好。

在vimrc中配置如下:

这样按下F2就可以直接呼出fencview界面,再按下就会关闭。

当然,如果您是一位经常处理多国编码的用户,那么可能直接安装fencview.vim,并且将自动检测打开会更好些,但是对于vim自己的控制就少了,我想作为vimer肯定不想如此吧,呵呵。

另外,按照上面的格式来配置vim的话,在保存文件时,是不会更改文件格式的,如果想要强制更改,例如要改成utf-8,可以用set fenc=utf-8来执行,之后写入即可。

好啦,就到这里。

版权所有,转载请注明出处。 http://www.vimer.cn

windows下使用vim(gvim)的不便及解决方案(1)-文件查找和软链接

相信不少朋友像我一样,无论在linux还是windows下都用vim来办公,但是毕竟vim原生于linux,windows下的某些支持还是做的不太好。 这个系列的文章,我们就一起...

阅读全文

vim(gvim)一键执行python脚本的bug

前一段时间在博客中和fuadam讨论过python中调用print的时候,是否可以直接打印decode之后的字符的问题。(原文:python-django的中文编码总结) 一开始我...

阅读全文

windows下搭建python+apache环境(for python2.6 special)

之前已经写了一篇linux下搭建python+apache的文章。但由于windows下的支持python2.6的mod_python.so一直没有找到下载(http://www.apache.org/dist/httpd/mod...

阅读全文

25则回应给“VIM解决中文编码问题”

  1. isunbo说道:

    我按照上面所写的修改了我的vimrc文件,这时候再读取.txt文件的时候就都是乱码了,后来我改成fencs=cp936,ucs-bom,utf-8,chinese就能正常显示了.

    [回复]

    Dante 回复:

    呃,奇怪,你可以打开那个文件之后,敲入:set fenc 看一下编码格式到底是什么~~chinese应该和cp936一样的编码格式才对阿

    [回复]

    isunbo 回复:

    找到原因了,因为我是笨蛋…写成cp938了…

    [回复]

  2. sosowo说道:

    为啥我在试菜单乱码处理那一段时候
    vim提示我说:
    g:iswindows is undefined variable

    悲剧,其他的编码都是好的,谢谢

    [回复]

    Dante 回复:

    呃,是我的问题。

    if(g:iswindows==1)
    换成
    if(has(“win32″) || has(“win95″) || has(“win64″) || has(“win16″))

    [回复]

    sosowo 回复:


    在你的IDE系列文章的第一篇里面
    发现了“g:iswindows”的出处
    所以能理解,已经加入vimrc中
    没有问题,谢谢

    [回复]

  3. playts说道:

    感谢作者的分享,按照作者的提示终于解决了乱码问题。

    [回复]

    Dante 回复:

    呵呵,不客气~~

    [回复]

  4. 吴叔说道:

    博主..这个问题真搞不定了..求帮助..set encoding=utf-8
    之后,中文输出到cmd里面的就乱码了,我分析可能是因为CMD默认编码是gbk的原因,有无解决办法?

    [回复]

    吴叔 回复:

    类似于这种语句 echohl WarningMsg | echo '不是php文件' | echohl None,中文也是没有办法显示出来的

    [回复]

    Dante 回复:

    中文输出到CMD乱码确实是可能的,因为你设置了Vim内部编码为utf8,我之前记得是要改一下windows的一个语言的配置,不过后来觉得没什么必要给丢掉了。。

    对第二个问题不太可能哦,你是用gvim还是vim,如果是windows下的vim,还是在cmd终端里,所以也是一样的问题。。

    [回复]

    依云 回复:

    :h :lang 看看吧。

    [回复]

    吴叔 回复:

    谢谢,很无厘头啊,我把encodig改成了cp936,执行了一下echohl WarningMsg | echo '不是php文件' 成功了,再改回utf-8,以后一直都可以了..晕死啊.

    [回复]

    Dante 回复:

    哈,这确实好奇怪。。。。不过搞定了就好呀

    [回复]

  5. [...] 编码识别: vim对亚洲这边的文字识别能力比较差,这个真的是vim的不足了,好在搞清楚了编码细节后也不是什么大问题,具体参见这篇文章链接,我就不转了,想搞清楚每句意思的请输入 [...]

  6. wellee说道:

    这篇文章解决了我初学的问题。谢谢

    [回复]

  7. zealkane说道:

    按上面说的修改vimrc后,在windows下启动gvim后里面就显示的是乱码,打开一个utf-8的文件里面可以正确显示中文,但运行命令时,提示信息是乱码。请教如何解决~
    顺便问一下,设置中文字体是,在vimrc文件里要使用中文,那vimrc文件用什么编码格式保存才能使中文用指定的字体显示。(我设置了gfw=新宋体,但显示的却不是)

    [回复]

    默默的伴随 回复:

    字体要指明编码:
    gfw=新宋体:cANSI

    [回复]

  8. L说道:

    这个我在linux下和windows下都用所以还是有点心得的,windows的好说。
    在linux下,如果你安装过中文字库的话,就需要有三行指令才能在正文里面显示正常的中文字符。就像博主说的,有
    set encoding=XXXXX
    set fileencodings=XXXXX
    set ambiwidth=double
    这个XXXX具体是什么就看你自己的工作环境了。还有博主写的fileencodings的顺序,好像如果工作环境不同的话是有影响的。我在某篇高人的文献里面看到的顺序好像是这样的
    set fileencodings=ucs-bom,utf-8,cp936,gb2312,gb18030,big5,euc-jp,euc-kr,latinl
    这是由于识别码的顺序优先级高低的问题。

    [回复]

    Dante 回复:

    嗯,fileencodings这里,除非你真的能用到简繁体,日文,韩文,否则我还是建议,只检测utf8和gbk就可以了,不是这两种的话就自动认为是拉丁,然后用fencview手工选择。。

    [回复]

  9. lfqy说道:

    您好。
    问下,为什么我在我将一段带有欧洲字符的文字,粘贴到vim中,保存后再打开,欧洲字符都变成了奇怪的汉字。
    求指教

    [回复]

  10. Vim Tips说道:

    […] byte of Vim VIM教程与学习资料汇总 Vim解决中文编码问题 Vim Scripts Mirror Windows Vim for […]

  11. qlyzpqz说道:

    如果一个文件里,有多种编码的混合,怎么样强制使用某种编码进行显示呢?

    [回复]

  12. 小张老李说道:

    我在配置里设置了 set encoding=utf-8 和 set fenc=utf-8,打开任何一种编码格式的文件,敲入:set fenc 都显示 utf-8, 保存之后还是原编码没有变。在网上找了几遍,和楼主的方法都差不多,始终无法解决,将文件转成utf-8编码。

    [回复]

    朱念洋 回复:

    fileencodings 这个是检测。

    [回复]

发表评论