共计 1604 个字符,预计需要花费 5 分钟才能阅读完成。
导读 | vim 编码涉及四个概念,分别是 enc,fenc,fencs,tenc, 一般乱码多是因这些参数设置不正确引起的,要想彻底摆脱 vim 的乱码问题,还是把这四个概念理清楚了,下面详细介绍之。 |
encoding(简写为 enc)
enc 的全称为 encoding,这是 Vim 内部使用的编码,如 buffer,寄存器中的字符串。在 Vim 打开文本后,如果它的编码方式与它的内部编码不一致,Vim 会先把编码转换成内部编码,如果它用的编码中含有没法转换为内部编码的字符,那么这些字符就会丢失掉。默认值是系统的 locale 来决定的,比如在 windows 下一般就是 gbk 或 gb2312 的,而在 linux 下就是 utf-8。可以用命令:set enc 查看当前 vim 的 enc 是什么值,笔者的 windows 显示的是 cp936 这里的 cp936 其实相当于 gb2312,指系统的第 936 号编码格式。
fileencoding(简写为 fenc)
fenc 为当前缓冲区(当前 Vim 打开这个文件)文件自身的编码,从磁盘读文件时,Vim 会对文件编码检查,如果文件的编码与 Vim 内部编码(enc)不同,Vim 就会对文本做编码转换,将 fenc 设置为文件的编码。Vim 写文件到磁盘时,如果 enc 与 fenc 不一样,Vim 就做编码转换,转换成编码 fenc 保存文件。在 windows 下你可以借由 notepad++ 等编辑器检查文件是什么编码的。由于 fenc 是在打开文件时由 Vim 自动检测的,所以如果文章中有乱码也没法通过重新设置 fenc 来纠正,设置 fenc 只能改变文本的编码格式。
fileencodings(简写为 fencs)
这是一个字符编码的列表,编码的自动识别就是通过设置 fencs 实现的。当打开一个文件时,Vim 会按照 fencs 中编码的顺序进行解码操作,如果匹配成功就用该编码来进行解码,并把这种编码设为 fenc 的值。这里的匹配成功指的是 Vim 能正确解码,不会出错,但是不保证没有乱码,所以 fencs 编码列表的顺序设置很关键,由于 lanin1 是 iso8859-1,属于国际化的标准编码,他能表示任何字符,也就用于也不会出错,但是我们看到的可以是“乱码”。所以一般 fencs 设置的顺序是这样子的:lan1 放到最后面
set fileencodings=ucs-bom,utf-8,cp936,gb18030,big5,euc-jp,euc-kr,latin1
终端使用文本编码,或者说是 Vim 用于屏幕显示时的编码,显示的时候 Vim 会把内部编码转换为屏幕编码再输出,也就是说我们从屏幕上看到的字符都是 tenc 编码的字符,如果为空,默认就是 enc。windows 平台 Gvim 会忽略掉 tenc。一般就是从一个终端远程登陆到 linux 系统时候 tenc 会起作用。
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""vim7.1 在 windows 下的编码设置""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
set encoding=utf-8
set fileencodings=utf-8,chinese,latin-1
if has("win32")
set fileencoding=chinese
else
set fileencoding=utf-8
endif
" 解决菜单乱码
source $VIMRUNTIME/delmenu.vim
source $VIMRUNTIME/menu.vim
" 解决 consle 输出乱码
language messages zh_CN.utf-8
菜单乱码只需要重新 source 一遍就好了。