vim字符编码详解

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在打开已存在文件时,与字符编码相关的事项有以下几件:

  1. 根据fileencodings的列表值,探测file.txt的编码格式。
    1.1 utf-8探测成功,然后vim会设置fileencoding为探测成功的编码类型,此处即为utf-8注:即便是在.vimrc文件中设置了fileencoding也不会生效,而是以探测到的编码类型为准。
    1.2 fileencodings中的所有值,均与当前打开的文件的编码格式匹配失败,则将fileencoding设置为空。fileencoding为空的情况下,可以认为其值和encoding保持一致,encoding的含义后文会讲述。
  2. 当要保存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在打开新文件时,与字符编码相关的事项有:

  1. 根据fileencoding的值,保存新文件。另,在vim里,可以通过:set fileencoding=gbk设置fileencoding的值,设置完后即可生效,即此时保存文件的话,file.txt会以gbk的编码格式存入磁盘。
  2. 若是没有设置fileencoding的值,可以通过在vim中执行:set fenc?查看其默认值,当为空时,表示其值和encoding相同。

总结:

  • vim打开一个新文件时,fileencodings是没有任何作用的。
  • 保存文件时,会以fileencoding指定的编码将文件写入磁盘。

1.2 encoding

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

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

总结:

  • encoding默认为$LANG,追随系统配置,不建议修改。
  • 读转换:当探测到的编码格式和encoding不同时
  • 写转换:当fileencodingencoding不同时
  • encoding不是utf-8或者其他Unicode时,编码格式的转换(读转换或写转换)可能造成非latin1字符的丢失。(由此可见,最好让系统默认的locale设置为utf-8

1.3 termencoding

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

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

2 建议

  1. 使用默认值配置是比较合理的。在遇到具体问题时,可以根据相关原理定位问题并寻求合理的解决方式。
  2. 尽量保持encodingutf-8或其他Unicode,保持默认值。参考自vim:help enc
  3. 如果要设置fileencodings,从超集到子集的顺序,即不要把1字节编码放到最前边;可以考虑吧Unicode放在最前边;若是ucs-bomutf-8或其他Unicode出现在fileencodings中,保持ucs-bom在前。参考自vim:help fencs
  4. 遇到问题的解决思路:
    1. 查看系统locale配置,查看终端编码配置。
    2. 确定文件编码类型。
    3. 确定fileencodings里有待打开文件的编码格式。
    4. 打开后确认fileencoding是否探测正确。
    5. 查看encoding值,若和终端编码配置不一致,可以考虑设置tremencoding

SEE ALSO

:help enc
:help fenc
:help fencs
:help tenc

vim缩进设置详解

vimrc配置文件

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值