美文网首页
2022-11-07

2022-11-07

作者: 何伸雅怀 | 来源:发表于2022-11-06 10:44 被阅读0次

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

    2022-11-07 2022-11-07小猪日更12天 今天周一,法定工作日,忙碌将从这一天开始,苦逼的打工狗啊...

  • 2022-11-07

    Nat Mac Int | AI模型稳定预测药物疗效 原创图灵基因图灵基因2022-11-07 11:12发表于江...

  • 2022-11-07

    Nature | AI发现促进肠道炎症的环境因素 原创珍奇图灵基因2022-11-07 11:12发表于江苏 收录...

  • 0370|赞美式嘉许

    2022-11-07 北京 晴天,看了美美的日落。 今天感谢教练小组的嘉许~~ 一我喜欢做白日梦,很飘,假大空,很...

  • 羊太岁语录406(论缓急)

    才能乘以机遇等于成功。乘数被乘数其中一项为零,积为零。心急必然欲速不达,迟缓容易失去机遇。 2022-11-07

  • 随记

    2022-11-07 文字方面定位 文字可以鼓励人,激励人。如果写,方向可以是自身专业成长,内心力量成长。两个方面...

  • 一读丨《天狗》:从泛神、泛我到非我

    原创孙绍振语文建设杂志2022-11-07 15:47发表于北京 收录于合集#【专栏】13个 更多精彩,请点击上方...

  • 【一剪梅】 咏柳

    【一剪梅】咏柳 (2022-11-07) 拂水垂丝画阁东,飞絮无辜,蒙月缘风。沈园老树历清霜,纵使秋波,亦照惊鸿。...

  • 毫无交流的夫妻(七十二房租客之十一)

    毫无交流的夫妻(七十二房租客之十一) 2022-11-07 今天我们再来说说二楼的中间户,虽然都在二楼,但这个中间...

  • 【日更41】(连载1)顶头上司让她不甘忍受,只因她是一面镜子..

    2022-11-07 以人为镜,可以明得失。 这句话耳熟能详。对马上满四十岁的小艾来说,却是以自己的亲身经历给这句...

网友评论

      本文标题:2022-11-07

      本文链接:https://www.haomeiwen.com/subject/vtubtdtx.html