Contents
  1. 1. encoding
  2. 2. termencoding
  3. 3. fileencoding
  4. 4. fileencodings

在 Vim 中,有四个与编码有关的选项,它们是:fileencodingsfileencodingencodingter
mencoding
。在实际使用中,任何一个选项出现错误,都会导致出现乱码。因此,每一个 Vim 用户都应该明确这
四个选项的含义。下面,我们详细介绍一下这四个选项的含义和作用。

encoding

encoding 是 Vim 内部使用的字符编码方式。当我们设置了 encoding 之后,Vim 内部所有的 buffer、寄存器、脚
本中的字符串等,全都使用这个编码。Vim 在工作的时候,如果编码方式与它的内部编码不一致,它会先把编码转
换成内部编码。如果工作用的编码中含有无法转换为内部编码的字符,在这些字符就会丢失。因此,在选择 Vim 的
内部编码的时候,一定要使用一种表现能力足够强的编码,以免影响正常工作。

由于 encoding 选项涉及到 Vim 中所有字符的内部表示,因此只能在 Vim 启动的时候设置一次。在 Vim 工作过程
中修改 encoding 会造成非常多的问题。如果没有特别的理由,请始终将 encoding 设置为 utf-8。为了避免在非
UTF-8 的系统如 Windows 下,菜单和系统提示出现乱码,可同时做这几项设置:

1
2
3
set encoding=utf-8
set langmenu=zh_CN.UTF-8
language message zh_CN.UTF-8

termencoding

termencoding 是 Vim 用于屏幕显示的编码,在显示的时候,Vim 会把内部编码转换为屏幕编码,再用于输出。内
部编码中含有无法转换为屏幕编码的字符时,该字符会变成问号,但不会影响对它的编辑操作。如果 termencoding
没有设置,则直接使用 encoding 不进行转换。

举个例子,当你在 Windows 下通过 telnet 登录 Linux 工作站时,由于 Windows 的 telnet 是 GBK 编码的,而
Linux 下使用 UTF-8 编码,你在 telnet 下的 Vim 中就会乱码。此时有两种消除乱码的方式:一是把 Vim 的
encoding 改为 gbk,另一种方法是保持 encoding 为 utf-8,把 termencoding 改为 gbk,让 Vim 在显示的时候
转码。显然,使用前一种方法时,如果遇到编辑的文件中含有 GBK 无法表示的字符时,这些字符就会丢失。但如果
使用后一种方法,虽然由于终端所限,这些字符无法显示,但在编辑过程中这些字符是不会丢失的。

fileencoding

当 Vim 从磁盘上读取文件的时候,会对文件的编码进行探测。如果文件的编码方式和 Vim 的内部编码方式不同,
Vim 就会对编码进行转换。转换完毕后,Vim 会将 fileencoding 选项设置为文件的编码。当 Vim 存盘的时候,如
果 encoding 和 fileencoding 不一样,Vim 就会进行编码转换。因此,通过打开文件后设置 fileencoding,我们
可以将文件由一种编码转换为另一种编码。但是,由前面的介绍可以看出,fileencoding 是在打开文件的时候,由
Vim 进行探测后自动设置的。因此,如果出现乱码,我们无法通过在打开文件后重新设置 fileencoding 来纠正乱
码。

fileencodings

编码的自动识别是通过设置 fileencodings 实现的,注意是复数形式。fileencodings 是一个用逗号分隔的列表,
列表中的每一项是一种编码的名称。当我们打开文件的时候,VIM 按顺序使用 fileencodings 中的编码进行尝试解
码,如果成功的话,就使用该编码方式进行解码,并将 fileencoding 设置为这个值,如果失败的话,就继续试验
下一个编码。

因此,我们在设置 fileencodings 的时候,一定要把要求严格的、当文件不是这个编码的时候更容易出现解码失败
的编码方式放在前面,把宽松的编码方式放在后面。

资料推荐:http://edyfox.codecarver.org/html/vim_fileencodings_detection.html

Contents
  1. 1. encoding
  2. 2. termencoding
  3. 3. fileencoding
  4. 4. fileencodings