Vim
的编码详解和中文环境设置
很惭愧,作为
vim
的忠实用户,自从
2
年多前从
help
里知道了
:edit
++enc=xxx
这个命令之后,我就没有去了解过
vim
的编码设定了。这些年来,我遇到编码出
错,总是
:edit
++enc=xxx
。今天
:help
了一下
encoding
等,终于搞清楚了相关的各个变量的作用和关系。
简单的说,有三个设置。
(
我下面基本以中文环境来作为说明
)
1)
在
.vimrc
或者
_vimrc
里加入
set
fileencodings=utf-8,gb2312,gbk,gb18030,big5
这句就基本
OK
了。
vim
会依次使用这些
编码对文件进行编码的猜测。
2)
如果还是不行,那么在打开文件之后,用
:edit
++enc=gbk
这个命令强制使用某个编码。
3)
如果依然不行,请检查你的
$LANG
环境变量。
下面是详细的说明。
vim
编码主要涉及三个变量。
encoding
vim
的内部编码,包括内存数据的编码,
vim
配置文件的编码。
encoding
取自变量
$LANG
,
如果
$LANG
为空,则取
latin1
。这个编码应该和你的终端编码保持一致的。
fileencoding
文件的编码。
vim
在加载文件的时候,会把这个编码转换成
encoding
参数的编码。同样的,
保存文件的时候,内存的编码会由
encoding
转变为
fileencoding
。
需要注意的是,在
vimrc
里设置这个参数,不会起作用。因为打开一个文件的时候,
fileencodings
或者
encoding
会覆盖
fileencoding
。关于这个,可以看下面提到的打开文件
流程。
fileencodings=utf-8,gbk,gb2312
vim
在加载一个文件的时候,会依次尝试使用
fileencodings
里的编码作为
fileencoding
。如
果全部失败,那么
vim
会使用
encoding
作为
fileencoding
。
另外,如果
vim
使用了错误的编码,可以使用
edit
++enc=gbk
这个命令。意思是,重新读取文件,并强制使用
gbk
作为
fileencoding
。这时候
会忽略
filencodings
。
以下是一些
vim
操作的内部流程
打开文件
首先从文件读入数据到内存,然后从
fileencodings
里依次使用各个编码来尝试转换为
encoding
。如果有一个成功,则中止尝试。如果找不到,则取
encoding
作为
fileencoding
。
也就是说,这里有一个从
fileencoding
转换为
encoding
的过程。
保存文件
把内存的数据,从
encoding
,转换为
fileencoding
,然后写入文件。