1 问题描述及解决
系统locale是zh_CN.UTF-8,用了我以前的配置文件,终端下运行VIM却出现乱码情况。互联网搜索一番,发现解决方案其实很 简单,在vimrc里面设置好encoding、fileencoding、termencoding的值即可。
我原始配置文件关于CJK支持方面的设置如下(非原创):
" Multi-encoding setting, MUST BE IN THE BEGINNING OF .vimrc!
if has("multi_byte")
" When 'fileencodings' starts with 'ucs-bom', don't do this manually
"set bomb
set fileencodings=ucs-bom,utf-8,cp936,taiwan,japan,korea,latin1
" CJK environment detection and corresponding setting
if v:lang =~ "^zh_CN"
" Simplified Chinese, on Unix euc-cn, on MS-Windows cp936
set encoding=cp936
set termencoding=cp936
if &fileencoding == ''
set fileencoding=cp936
endif
elseif v:lang =~ "^zh_TW"
" Traditional Chinese, on Unix euc-tw, on MS-Windows cp950
set encoding=taiwan
set termencoding=taiwan
if &fileencoding == ''
set fileencoding=taiwan
endif
elseif v:lang =~ "^ja_JP"
" Japanese, on Unix euc-jp, on MS-Windows cp932
set encoding=japan
set termencoding=japan
if &fileencoding == ''
set fileencoding=japan
endif
elseif v:lang =~ "^ko"
" Korean on Unix euc-kr, on MS-Windows cp949
set encoding=korea
set termencoding=korea
if &fileencoding == ''
set fileencoding=korea
endif
endif
" Detect UTF-8 locale, and override CJK setting if needed
if v:lang =~ "utf8$" || v:lang =~ "UTF-8$"
set encoding=utf-8
endif
else
echoerr 'Sorry, this version of (g)Vim was not compiled with "multi_byte"'
endif
问题出在“Detec UTF-8 locale...”下面那三行,改为以下形式,保存,即可解决:
if v:lang =~ "utf8$" || v:lang =~ "UTF-8$"
set encoding=utf-8
set termencoding=utf-8
if &fileencoding == ''
set fileencoding=utf-8
endif
endif
2 VIM相关选项说明
- encoding
- 设置 Vim 内部使用的字符编码。它应用于缓冲区、寄存器、表达式所用的字符串、viminfo 保存的等等各种文本。该选项设置 Vim 可以工作的字符类型。通常,'encoding' 应该等同于你现有的 locale。如果 Vim 能识别环境变量的设定,这应是该选项的缺省值。如果 'encoding' 没有设为你现有的 locale,必须设定 'termencoding' 来转换输入和显示的文本。
- fileencoding
- 设置此缓冲区所在文件的字符编码。如果 'fileencoding' 不同于 'encoding',写文件时需要进行转换。读入文件时,'fileencoding' 会根据 'fileencodings' 进行设置。
- fileencodings
- 这是一个字符编码的列表,开始编辑已存在的文件时,参考此选项。如果文件被读入,Vim 尝试使用本列表第一个字符编码。如果检测到错误,使用列表的下一个。如果找到一个能用的编码,设置 'fileencoding' 为该值。如果全都失败,'fileencoding' 设为空字符串,这意味着使用 'encoding' 的值。
- termencoding
- 终端使用的编码。它指定键盘产生的和显示能识别的字符编码。对 GUI 而言,这只适用于键盘 ('encoding' 用于显示)。
一般情况下,'encoding' 和当前的 locale 相同,'termencoding' 为空,这意味着键盘和显示方式以当前 locale 编码字符,Vim 内部也使用相同的字符。
你可以通过设置 'encodng' 为不同的值来使 Vim 使用另一种编码方式。但是由於键盘和显示仍用当前的 locale,这就需要编码之间的转换。这时 'termencoding' 替代了当前locale 值,而 Vim 负责在 'encoding' 和 'termencoding' 之间转换。例如:
:let &termencoding = &encoding :set encoding=utf-8
3 参考文档
3.1 解决vim中文乱码问题(转载)
3.2 VIM帮助文档(在vim中运行:help或:help 主题名)
Views: 426