最后更新于 .

虽然VIM自7.0之后对双字节的编码已经支持的很不错了,但是,还是需要一些配置才能完全实现的哦。 要解决的问题: 1.识别双字节编码格式 需要先了解的知识: vim中的内置变量: enc(encoding):vim的内部编码 fenc(fileencoding):vim解析出来的当前文件编码(有可能解析成错的哦) fencs(fileencodings):vim解析文件时猜测的编码格式顺序列表 需要的配置: 1.vimrc中的代码如下:

set encoding=utf-8
set fenc=cp936
set fileencodings=cp936,ucs-bom,utf-8
if(g:iswindows==1)
    source $VIMRUNTIME/delmenu.vim
    source $VIMRUNTIME/menu.vim
    language messages zh_CN.utf-8
endif
if v:lang =~? '^\(zh\)\|\(ja\)\|\(ko\)'
    set ambiwidth=double
endif
set nobomb

解释如下:

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格式,可以如下配置:

set fenc=utf-8
set fileencodings=ucs-bom,utf-8,cp936

接下来:

if(g:iswindows==1)
    source $VIMRUNTIME/delmenu.vim
    source $VIMRUNTIME/menu.vim
    language messages zh_CN.utf-8
endif

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

if v:lang =~? '^\(zh\)\|\(ja\)\|\(ko\)'
    set ambiwidth=double
endif

是为了让vim能够默认以双字节处理那些特殊字符。 set nobomb 是让vim不要自动设置字节序标记,因为并不是所有编辑器都可以识别字节序标记的。 2.由于即便配置了上述的代码,也不一定能够100%认识对编码,所以推荐大家安装一款插件,是国人写的,挺不错的。 fencview.vim 这款插件集成了自动检测编码格式的能力,但是笔者测试过似乎不是很准,所以还是建议关掉自动检测,只有在vim检测失败的时候,才调出fencview,手动选择编码比较好。 在vimrc中配置如下:

"关闭自动检测
let g:fencview_autodetect=0
map <F2> :FencView

这样按下F2就可以直接呼出fencview界面,再按下就会关闭。 当然,如果您是一位经常处理多国编码的用户,那么可能直接安装fencview.vim,并且将自动检测打开会更好些,但是对于vim自己的控制就少了,我想作为vimer肯定不想如此吧,呵呵。 另外,按照上面的格式来配置vim的话,在保存文件时,是不会更改文件格式的,如果想要强制更改,例如要改成utf-8,可以用set fenc=utf-8来执行,之后写入即可。 好啦,就到这里。 版权所有,转载请注明出处。 https://www.vimer.cn

Pingbacks

  1. 把gvim用的像个记事本 | 九连环 on #

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

  2. Vim Tips on #

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

Pingbacks已打开。

Trackbacks

引用地址

评论

  1. isunbo

    isunbo on #

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

    Reply

    1. Dante

      Dante on #

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

      Reply

      1. isunbo

        isunbo on #

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

        Reply

  2. sosowo

    sosowo on #

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

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

    Reply

    1. Dante

      Dante on #

      呃,是我的问题。

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

      Reply

      1. sosowo

        sosowo on #


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

        Reply

  3. playts

    playts on #

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

    Reply

    1. Dante

      Dante on #

      呵呵,不客气~~

      Reply

  4. 吴叔

    吴叔 on #

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

    Reply

    1. 吴叔

      吴叔 on #

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

      Reply

      1. Dante

        Dante on #

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

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

        Reply

    2. 依云

      依云 on #

      :h :lang 看看吧。

      Reply

      1. 吴叔

        吴叔 on #

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

        Reply

        1. Dante

          Dante on #

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

          Reply

  5. wellee

    wellee on #

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

    Reply

  6. zealkane

    zealkane on #

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

    Reply

    1. 默默的伴随

      默默的伴随 on #

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

      Reply

  7. L

    L on #

    这个我在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
    这是由于识别码的顺序优先级高低的问题。

    Reply

    1. Dante

      Dante on #

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

      Reply

  8. lfqy

    lfqy on #

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

    Reply

  9. qlyzpqz

    qlyzpqz on #

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

    Reply

  10. 小张老李

    小张老李 on #

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

    Reply

    1. Dante

      Dante on #

      fileencodings 这个是检测。

      Reply

发表评论