2022-11-07

1 选项解析

编码相关的选项配置,有4个:fileencodings(fencs)、fileencoding(fenc)、encoding(enc)、termencoding(tenc)。后文会对这些选项,由浅及深一一分析。

1.1 fileencodings和fileencoding

1.1.1 打开已存在文件

vim file.txt

为了说明vim打开文件的过程,首先作出以下假设:

使用vim file.txt命令打开一个已存在的文件

该文件是以utf-8的编码格式存储在文件系统的。

.vimrc配置文件中对fileencodings的配置为:set fileencodings=utf-8,gb18030,gbk,gb2312,cp936

vim在打开已存在文件时,与字符编码相关的事项有以下几件:

根据fileencodings的列表值,探测file.txt的编码格式。

1.1 utf-8探测成功,然后vim会设置fileencoding为探测成功的编码类型,此处即为utf-8。注:即便是在.vimrc文件中设置了fileencoding也不会生效,而是以探测到的编码类型为准。

1.2 fileencodings中的所有值,均与当前打开的文件的编码格式匹配失败,则将fileencoding设置为空。fileencoding为空的情况下,可以认为其值和encoding保持一致,encoding的含义后文会讲述。

当要保存file.txt文件时,vim会以fileencoding指定的编码(即utf-8)将文件写入到磁盘。另,在vim里,可以通过:set fileencoding=gbk设置fileencoding的值,设置完后即可生效,即此时保存文件的话,file.txt会以gbk的编码格式存入磁盘。

总结:

vim打开一个已存在的文件时,.vimrc里对fileencoding的设置无效。

vim打开一个已存在的文件时,若没有使用++enc选项(指定以何种编码格式打开该文件),vim会依照fileencodings的值,对打开的文件进行探测,探测其的编码格式。成功探测到编码格式后,会将fileencoding设置为探测到的编码格式;探测失败后,会将fileencoding设置为空,表示其值和encoding保持一致。

一般fileencodings会在.vimrc里面设置,如果没有设置,默认值可通过在vim中执行:help fencs查看。

保存文件时,会以fileencoding指定的编码将文件写入磁盘。比如通过执行:set fenc?查看到fileencoding的值为utf-8,但又想以gbk的格式写入磁盘,可以先执行:set fenc=gbk后再保存文件。

1.1.2 打开新文件

vim newfile.txt

为了说明vim打开新文件的过程,首先作出以下假设:

使用vim newfile.txt命令打开一个不存在的文件

.vimrc配置文件中对fileencoding的配置为:set fileencoding=utf-8

vim在打开新文件时,与字符编码相关的事项有:

根据fileencoding的值,保存新文件。另,在vim里,可以通过:set fileencoding=gbk设置fileencoding的值,设置完后即可生效,即此时保存文件的话,file.txt会以gbk的编码格式存入磁盘。

若是没有设置fileencoding的值,可以通过在vim中执行:set fenc?查看其默认值,当为空时,表示其值和encoding相同。

总结:

vim打开一个新文件时,fileencodings是没有任何作用的。

保存文件时,会以fileencoding指定的编码将文件写入磁盘。

1.2 encoding

vim内部(buffer、寄存器等)编码格式。

在.vimrc中通过set encoding=gbk将encoding设置为gbk,将文件读入时,比如fileencodings探测到当前文件是utf-8并把fileencoding设置为utf-8,则vim在读取文件时,会将utf-8转换为gbk放在buffer中,最后写入磁盘的时候,还会将buffer中的内容(encoding格式,此处为gbk)转换为fileencoding格式(此处为utf-8)

总结:

encoding默认为$LANG,追随系统配置,不建议修改。

读转换:当探测到的编码格式和encoding不同时

写转换:当fileencoding和encoding不同时

当encoding不是utf-8或者其他Unicode时,编码格式的转换(读转换或写转换)可能造成非latin1字符的丢失。(由此可见,最好让系统默认的locale设置为utf-8)

1.3 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无法表示的字符时,这些字符就会丢失。但如果使用后一种方法,虽然由于终端所限,这些字符无法显示,但在编辑过程中这些字符是不会丢失的。

2 建议

使用默认值配置是比较合理的。在遇到具体问题时,可以根据相关原理定位问题并寻求合理的解决方式。

尽量保持encoding为utf-8或其他Unicode,保持默认值。参考自vim的:help enc。

如果要设置fileencodings,从超集到子集的顺序,即不要把1字节编码放到最前边;可以考虑吧Unicode放在最前边;若是ucs-bom和utf-8或其他Unicode出现在fileencodings中,保持ucs-bom在前。参考自vim的:help fencs。

遇到问题的解决思路:

查看系统locale配置,查看终端编码配置。

确定文件编码类型。

确定fileencodings里有待打开文件的编码格式。

打开后确认fileencoding是否探测正确。

查看encoding值,若和终端编码配置不一致,可以考虑设置tremencoding。

SEE ALSO

:help enc

:help fenc

:help fencs

:help tenc

你可能感兴趣的:(2022-11-07)