VIM解决中文编码问题
虽然VIM自7.0之后对双字节的编码已经支持的很不错了,但是,还是需要一些配置才能完全实现的哦。
要解决的问题:
1.识别双字节编码格式
需要先了解的知识:
vim中的内置变量:
enc(encoding):vim的内部编码
fenc(fileencoding):vim解析出来的当前文件编码(有可能解析成错的哦)
fencs(fileencodings):vim解析文件时猜测的编码格式顺序列表
需要的配置:
1.vimrc中的代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 | 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格式,可以如下配置:
1 2 | set fenc=utf-8 set fileencodings=ucs-bom,utf-8,cp936 |
接下来:
1 2 3 4 5 | if(g:iswindows==1) source $VIMRUNTIME/delmenu.vim source $VIMRUNTIME/menu.vim language messages zh_CN.utf-8 endif |
这段代码是防止菜单乱码。
1 2 3 | if v:lang =~? '^\(zh\)\|\(ja\)\|\(ko\)' set ambiwidth=double endif |
是为了让vim能够默认以双字节处理那些特殊字符。
set nobomb 是让vim不要自动设置字节序标记,因为并不是所有编辑器都可以识别字节序标记的。
2.由于即便配置了上述的代码,也不一定能够100%认识对编码,所以推荐大家安装一款插件,是国人写的,挺不错的。
fencview.vim
这款插件集成了自动检测编码格式的能力,但是笔者测试过似乎不是很准,所以还是建议关掉自动检测,只有在vim检测失败的时候,才调出fencview,手动选择编码比较好。
在vimrc中配置如下:
1 2 3 | "关闭自动检测 let g:fencview_autodetect=0 map <F2> :FencView<cr> |
这样按下F2就可以直接呼出fencview界面,再按下就会关闭。
当然,如果您是一位经常处理多国编码的用户,那么可能直接安装fencview.vim,并且将自动检测打开会更好些,但是对于vim自己的控制就少了,我想作为vimer肯定不想如此吧,呵呵。
另外,按照上面的格式来配置vim的话,在保存文件时,是不会更改文件格式的,如果想要强制更改,例如要改成utf-8,可以用set fenc=utf-8来执行,之后写入即可。
好啦,就到这里。
版权所有,转载请注明出处。 http://www.vimer.cn
原创文章,版权所有。转载请注明:转载自Vimer的程序世界 [ http://www.vimer.cn ]
本文链接地址: http://www.vimer.cn/?p=87
我按照上面所写的修改了我的vimrc文件,这时候再读取.txt文件的时候就都是乱码了,后来我改成fencs=cp936,ucs-bom,utf-8,chinese就能正常显示了.
[回复]
Dante 回复:
十一月 3rd, 2009 at 10:56 下午
呃,奇怪,你可以打开那个文件之后,敲入:set fenc 看一下编码格式到底是什么~~chinese应该和cp936一样的编码格式才对阿
[回复]
isunbo 回复:
十一月 4th, 2009 at 12:15 下午
找到原因了,因为我是笨蛋…写成cp938了…
[回复]
为啥我在试菜单乱码处理那一段时候
vim提示我说:
g:iswindows is undefined variable
悲剧,其他的编码都是好的,谢谢
[回复]
Dante 回复:
四月 20th, 2010 at 10:39 下午
呃,是我的问题。
把
if(g:iswindows==1)
换成
if(has(“win32″) || has(“win95″) || has(“win64″) || has(“win16″))
[回复]
sosowo 回复:
四月 21st, 2010 at 1:24 下午
呃
在你的IDE系列文章的第一篇里面
发现了“g:iswindows”的出处
所以能理解,已经加入vimrc中
没有问题,谢谢
[回复]
感谢作者的分享,按照作者的提示终于解决了乱码问题。
[回复]
Dante 回复:
六月 23rd, 2010 at 10:07 上午
呵呵,不客气~~
[回复]
博主..这个问题真搞不定了..求帮助..
set encoding=utf-8
之后,中文输出到cmd里面的就乱码了,我分析可能是因为CMD默认编码是gbk的原因,有无解决办法?[回复]
吴叔 回复:
十二月 7th, 2010 at 3:45 上午
类似于这种语句
echohl WarningMsg | echo '不是php文件' | echohl None,中文也是没有办法显示出来的[回复]
Dante 回复:
十二月 7th, 2010 at 11:20 上午
中文输出到CMD乱码确实是可能的,因为你设置了Vim内部编码为utf8,我之前记得是要改一下windows的一个语言的配置,不过后来觉得没什么必要给丢掉了。。
对第二个问题不太可能哦,你是用gvim还是vim,如果是windows下的vim,还是在cmd终端里,所以也是一样的问题。。
[回复]
依云 回复:
十二月 7th, 2010 at 11:20 上午
:h :lang 看看吧。
[回复]
吴叔 回复:
十二月 7th, 2010 at 6:13 下午
谢谢,很无厘头啊,我把encodig改成了cp936,执行了一下
echohl WarningMsg | echo '不是php文件'成功了,再改回utf-8,以后一直都可以了..晕死啊.[回复]
Dante 回复:
十二月 8th, 2010 at 2:18 下午
哈,这确实好奇怪。。。。不过搞定了就好呀
[回复]
[...] 编码识别: vim对亚洲这边的文字识别能力比较差,这个真的是vim的不足了,好在搞清楚了编码细节后也不是什么大问题,具体参见这篇文章链接,我就不转了,想搞清楚每句意思的请输入 [...]
这篇文章解决了我初学的问题。谢谢
[回复]
按上面说的修改vimrc后,在windows下启动gvim后里面就显示的是乱码,打开一个utf-8的文件里面可以正确显示中文,但运行命令时,提示信息是乱码。请教如何解决~
顺便问一下,设置中文字体是,在vimrc文件里要使用中文,那vimrc文件用什么编码格式保存才能使中文用指定的字体显示。(我设置了gfw=新宋体,但显示的却不是)
[回复]
默默的伴随 回复:
四月 14th, 2011 at 9:27 上午
字体要指明编码:
gfw=新宋体:cANSI
[回复]
这个我在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 回复:
八月 19th, 2011 at 12:14 上午
嗯,fileencodings这里,除非你真的能用到简繁体,日文,韩文,否则我还是建议,只检测utf8和gbk就可以了,不是这两种的话就自动认为是拉丁,然后用fencview手工选择。。
[回复]