虽然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
isunbo on #
我按照上面所写的修改了我的vimrc文件,这时候再读取.txt文件的时候就都是乱码了,后来我改成fencs=cp936,ucs-bom,utf-8,chinese就能正常显示了.
Reply
Dante on #
呃,奇怪,你可以打开那个文件之后,敲入:set fenc 看一下编码格式到底是什么~~chinese应该和cp936一样的编码格式才对阿
Reply
isunbo on #
找到原因了,因为我是笨蛋...写成cp938了...
Reply
sosowo on #
为啥我在试菜单乱码处理那一段时候
vim提示我说:
g:iswindows is undefined variable
悲剧,其他的编码都是好的,谢谢
Reply
Dante on #
呃,是我的问题。
把
if(g:iswindows==1)
换成
if(has("win32") || has("win95") || has("win64") || has("win16"))
Reply
sosowo on #
呃
在你的IDE系列文章的第一篇里面
发现了“g:iswindows”的出处
所以能理解,已经加入vimrc中
没有问题,谢谢
Reply
playts on #
感谢作者的分享,按照作者的提示终于解决了乱码问题。
Reply
Dante on #
呵呵,不客气~~
Reply
吴叔 on #
博主..这个问题真搞不定了..求帮助..<code>set encoding=utf-8
</code>之后,中文输出到cmd里面的就乱码了,我分析可能是因为CMD默认编码是gbk的原因,有无解决办法?
Reply
吴叔 on #
类似于这种语句 <code> echohl WarningMsg | echo '不是php文件' | echohl None</code>,中文也是没有办法显示出来的
Reply
Dante on #
中文输出到CMD乱码确实是可能的,因为你设置了Vim内部编码为utf8,我之前记得是要改一下windows的一个语言的配置,不过后来觉得没什么必要给丢掉了。。
对第二个问题不太可能哦,你是用gvim还是vim,如果是windows下的vim,还是在cmd终端里,所以也是一样的问题。。
Reply
依云 on #
:h :lang 看看吧。
Reply
吴叔 on #
谢谢,很无厘头啊,我把encodig改成了cp936,执行了一下<code>echohl WarningMsg | echo '不是php文件'</code> 成功了,再改回utf-8,以后一直都可以了..晕死啊.
Reply
Dante on #
哈,这确实好奇怪。。。。不过搞定了就好呀
Reply
wellee on #
这篇文章解决了我初学的问题。谢谢
Reply
zealkane on #
按上面说的修改vimrc后,在windows下启动gvim后里面就显示的是乱码,打开一个utf-8的文件里面可以正确显示中文,但运行命令时,提示信息是乱码。请教如何解决~
顺便问一下,设置中文字体是,在vimrc文件里要使用中文,那vimrc文件用什么编码格式保存才能使中文用指定的字体显示。(我设置了gfw=新宋体,但显示的却不是)
Reply
默默的伴随 on #
字体要指明编码:
gfw=新宋体:cANSI
Reply
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
Dante on #
嗯,fileencodings这里,除非你真的能用到简繁体,日文,韩文,否则我还是建议,只检测utf8和gbk就可以了,不是这两种的话就自动认为是拉丁,然后用fencview手工选择。。
Reply
lfqy on #
您好。
问下,为什么我在我将一段带有欧洲字符的文字,粘贴到vim中,保存后再打开,欧洲字符都变成了奇怪的汉字。
求指教
Reply
qlyzpqz on #
如果一个文件里,有多种编码的混合,怎么样强制使用某种编码进行显示呢?
Reply
小张老李 on #
我在配置里设置了 set encoding=utf-8 和 set fenc=utf-8,打开任何一种编码格式的文件,敲入:set fenc 都显示 utf-8, 保存之后还是原编码没有变。在网上找了几遍,和楼主的方法都差不多,始终无法解决,将文件转成utf-8编码。
Reply
Dante on #
fileencodings 这个是检测。
Reply