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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,816评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,729评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,300评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,780评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,890评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,084评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,151评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,912评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,355评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,666评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,809评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,504评论 4 334
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,150评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,882评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,121评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,628评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,724评论 2 351

推荐阅读更多精彩内容

  • 献上我经过测试以后的最终解决办法 首先第一步找到VIM的配置文件,windows中的vim的配置文件是: C:\P...
    晚辈曾阿牛阅读 7,760评论 1 4
  • 1 字符编码基础知识 字符编码是计算机技术中最基本和最重要的知识之一。如果缺乏相关知识,请自行恶补之。这里仅做最简...
    moto_yang阅读 1,165评论 0 1
  • 这个问题多数是出现在Linux服务器上修改dos上传的文件 本人问题场景描述,因为是做服务器管理了,Linux与M...
    LeeBoot阅读 2,233评论 0 1
  • tl,drWindows系统环境下gvim和vim的中文支持是不相同的。一般gvim按如下配置即可保证中文支持没有...
    mst7阅读 6,118评论 0 2
  • 大概每个人在使用软件时都遇到过乱码的问题,这是由于字符的编码和解码方式不一致导致,我们知道计算机只认识二进制数据,...
    楚客阅读 1,417评论 1 9