问题
遇到一个很奇怪的问题:在vi中输入中文后,无法保存。
原因分析:
由于英文能够保存,而中文无法保存一定是与编码有关。这时我们可以在 vi中查早帮助
: h encodeing
就可以看到,单字节字符和双字节字符的编码代码不一样,所以需要进行调整。
解决方案:
在.vimrc 中加入
set fileencodings=zh_CN.GB18030
或
set encoding=gb2312
原理分析:
具体需要查看
:h encodeing
(2)
1、支持中文编码的基础
Vim要更好地支持中文编码需要两个特性:+multi_byte和+iconv,可以用|:version|命令检查当前使用的Vim是否支持,否则的话需要重新编译。
2、影响中文编码的设置项
Vim中有几个选项会影响对多字节编码的支持:
- encoding(enc):encoding是Vim的内部使用编码,encoding的设置会影响Vim内部的Buffer、消息文字等。在 Unix环境下,encoding的默认设置等于locale;Windows环境下会和当前代码页相同。在中文Windows环境下encoding的 默认设置是cp936(GBK)。
- fileencodings(fenc):Vim在打开文件时会根据fileencodings选项来识别文件编码,fileencodings可以同时设置多个编码,Vim会根据设置的顺序来猜测所打开文件的编码。
- fileencoding(fencs) :Vim在保存新建文件时会根据fileencoding的设置编码来保存。如果是打开已有文件,Vim会根据打开文件时所识别的编码来保存,除非在保存时重新设置fileencoding。
- termencodings(tenc):在终端环境下使用Vim时,通过termencoding项来告诉Vim终端所使用的编码。
3、Vim中的编码转换
Vim内部使用iconv库进行编码转换,如果这几个选项所设置的编码不一致,Vim就有可能会转换编码。打开已有文件时会从文件编码转换到 encoding所设置的编码;保存文件时会从encoding设置的编码转换到fileencoding对应的编码。经常会看到Vim提示[已转换],这是表明Vim内部作了编码转换。终端环境下使用Vim,会从termencoding设置的编码转换到encoding设置的编码。
可以用|:help encoding-values|列出Vim支持的所有编码。
4、具体应用环境的设置
- 只编辑GBK编码的文件
set fileencodings=cp936
set fileencoding=cp936
set encoding=cp936
- 只编辑UTF-8编码的中文文件
set fileencodings=utf-8
set fileencoding=utf-8
set encoding=cp936 或者 set encoding=utf-8
- 同时支持GBK和UTF-8编码
set fileencodings=ucs-bom,utf-8,cp936
set fileencoding=utf-8
set encoding=cp936 或者 set encoding=utf-8
- 如果在终端环境下使用Vim,需要设置termencoding和终端所使用的编码一致。例如:
set termencoding=cp936 或者 set termencoding=utf-8
Windows记事本编辑UTF-8编码文件时会在文件头上加上三个字节的BOM:EFBBBF。如果fileencodings中设 置ucs-bom的目的就是为了能够兼容用记事本编辑的文件,不需要的话可以去掉。Vim在保存UTF-8编码的文件时会去掉BOM。去掉BOM的最大好 处是在Unix下能够使用cat a b>c来正确合并文件,这点经常被忽略。
5、FAQ
- 为什么在Vim中一次只能删除半个汉字?
因为encoding设置错误,把encoding设置为cp936就可以解决此问题。在Unix环境下Vim会根据locale来设置默认的encoding,如果没有正确设置locale并且没有设置encoding就会一次只能删除半个汉字。
- VIM为什么不能输入繁体字?
把euc-cn或者GB2312改为cp936就可以了。euc-cn是GB2312的别名,不支持繁体汉字。cp936是GBK的别名,是GB2312的超集,可以支持繁体汉字。
- VIM为什么提示不能转换?
因为在编译Vim时没有加入iconv选项,重新编译Vim才能解决。
- 如何打开一个GBK编码的文件并另存为UTf-8编码?
保存文件时运行命令|:set fileencoding=utf-8|就可以了。
开始用Vim编辑东西了,可是首先遇到了一个问题。就是如果在插入模式下输入中文,回到normal模式之后,再想输入命令,就得把输入法切换回英文才行,再进入输入模式,又得切回中文,相当的不方便。求助于google大神,发现了VimIM。
Vimim是一个非常好用的Vim中文输入插件。下面是它自己的介绍:
一个文本文件,构成一个中文输入法。插上联网就可以云输入。
如果再加上一二个文本文件,无需联网照样敲打中文,随心所欲。
程式文件用的是 vim script, 天生跨平台(Windows, Mac, Linux)
词库文件就是自己的输入法(全拼或双拼,五笔,英文,DIY)
所谓安装,就是把文本文件扔到 vim 的 plugin 目录之下。
单独插上【拼音】词库,就是vim拼音输入法(全拼或六种双拼)。
单独插上【嘸蝦米】词库,就是vim嘸蝦米輸入法。
同时插上【拼音★四角】,可以平行也可以交叉使用,无须切换。
同时插上【五笔★拼音】,可以平行使用,敲<C->动态切换。
不设选项,不换模式,点<C-6>就可以上汉字,是谓〖点石成金〗。
如果用<C->切换成中文输入模式,也可以将就当前流行的输入法习惯。
所谓卸载,就是删除文本文件。
那怎么安装这个这么好的小软件呢?
所谓安装,就是把VimIM插件 vimim.vim 和词库文本文件扔到 vim 的 plugin 目录之下。例如:我的 windows7系统,gvim安装在E:editVim,我又想安装五笔和拼音的词库,那就是要把下面三个文件放到E:editVimvim72plugin下面。
VimIM 插件: http://vim.sourceforge.net/scripts/script.php?script_id=2506
极点五笔: http://vimim-data.googlecode.com/svn/trunk/data/vimim.wubijd.txt
拼音大词库: http://vimim-data.googlecode.com/svn/trunk/data/vimim.pinyin_huge.txt
中文输入模式。
怎么用这个东西来在Vim中输入中文呢?
【经典动态模式】:let g:vimim_static_input_style=0 (缺省).
输入过程中一直出选择项目,或者说,每敲一个字母就蹦出一个选词菜单。
空格键上汉字,回车键上英文。用数字键确认汉字。ESC键输出英文并退出VIM插入模式。
在中文输入模式时,自动开启中文标点,若想输入英文标点,可先按CTRL+6后再输入。
【Sexy静态模式】:let g:vimim_static_input_style=2
包括〖点石成金〗全部功能.CTRL+开启,再按ctrl+关闭,开启时光标是绿色的。
空格键出选词菜单,数字或者字母选词,再空格键上词。
英文标点之后,空格键出中文标点.
回车键上英文,上英文后再按回车上空格。
想回到英文输入状态,可按CTRL+6.
在我的电脑里面,在这个模式下输入编码后光标偶尔不会在最后一个字符后面,按空格后正常,如果你也有这样的情况,请按下空格键吧。
都弄好了吧,可以开始享受在Vim中输入中文的乐趣了。