vim中的编码: encoding, fileencoding

玩儿程序的都知道编码,其实大家并不想了解编码,我理解你们的心情,直到有天你遇到了乱码

vim中的编码有好几个设定,但理解起来并不复杂

encoding

encoding是vim自己的编码。这是啥意思?就是vim工作时自己内部使用的编码。

当你打开一个光秃秃的vim, 不加载任何文件的时候,vim也是要工作的,这个鬼样子:

~
~
~
~                             VIM - Vi IMproved
~
~                              version 8.2.285
~                          by Bram Moolenaar et al.
~                Vim is open source and freely distributable
~
~                       Help poor children in Uganda!
~               type  :help iccf<Enter>       for information
~
~               type  :q<Enter>               to exit
~               type  :help<Enter>  or  <F1>  for on-line help
~               type  :help version8<Enter>   for version info
~
~
~
~
~
~
:ls
  1 %a   "[No Name]"                    line 1
Press ENTER or type command to continue

你可以查看buffer,使用register,vim此时就已经是一台运转良好的机器,需要显示字符,处理输入输出,这个时候它的编码是什么呢?就是encoding了。

把vim想象成一个给你干活的管家,这个管家是来自印度,encoding就是这个管家自己的家乡话,可能是梵语吧

encoding一般是在启动之前设置,启动之后再去设置可能会不起效果,一般都是设置为utf8

set  encoding = utf-8

fileencodings

现在用vim打开一个外部文件,这个文件可能是任意编码的,vim能打开吗?当然能的

vim的方法是瞎猜,它从fileencodings这个options中去查看可能的编码。一个个尝试,选择一个最可能的编码匹配文件

fileencodings就很重要了,设置了vim能解析的文件编码

set fileencodings=ucs-bom, utf-8, cp936, gb18030, big5, euc-jp, euc-kr, latin

fileencoding

当vim通过fileencodings匹配到文件编码之后,就会设置fileencoding,表示该文件使用的编码是什么。

以管家的例子来说,你说梵语的管家,接到了一份英文,或者中文,或者拉丁文的文件,它通过自己认识的语言中(fileencodings)检查了下文件内容,最后把该文件语种标注为:中文(fileencoding)

文件打开后,你可以手工设置fileencoding,注意此时并不会改变文件编码的,只有在文件被保存后,会被保存为最新设置的fileencoding,可以起到编码转换的效果

你嫌中文不够国际化,”英格利希“,你冷冷的对管家下了道指令。跟你多年的管家马上就明白主人您的意思,把这份文件翻译成了英文

fileencoding和encoding的关系?可以说没什么关系。这个没关系反而搞得内部机制很复杂,各种内部编码转换(Conversion),但我们都不用了解。

想象一下,一个说梵语的管家,在理解中文文件的时候,脑海中是不是要跟自己的梵语对应起来呢?法文是不是呢?英文呢?会的语言越多,类似的转换越复杂,所幸的是,这是管家的痛苦,与我们无关

当然,非要说关系,那还是有一点的,就是当你新建一个文件的时候,此时fileencoding就会采用默认的encoding。

还有个问题,如果vim猜测的fileencoding是错误的,满屏的乱码,跟我们预期不一样怎么办呢?

我们就得重新打开文件,手动指定编码了:

:e ++enc=utf-8 myfile.txt
:echo "愚蠢的管家"

termencoding

termencoding用来描述键盘输入的编码,一般都不用设置,默认和encoding保持一致

当敲击键盘,往vim传递字符的时候,这个字符的编码就是termencoding。

总结

以上几个编码,看起来内容很多,但其实我们基本上只管两个设定就可以:

set encoding=utf-8
set fileencodings=ucs-bom,utf-8,shift-jis,gb18030,gbk,gb2312,cp936,utf-16,big5,euc-jp,latin1

用管家的例子,一句话描述各种编码之间的关系:

你,傲娇的老爷,对着你说梵语(encoding)的管家,喷了一句法文:”stupide”(termencoding),并命令他,把这句话加到刚收到的英文文件(fileencoding)里面去。

我不知道你怎么想,但是你的管家心里一定想RTM

当然,我们可以简单一点,大家都说统一的语言:utf-8,这个世界就清净了



《 “vim中的编码: encoding, fileencoding” 》 有 5 条评论

  1. of patients DHEA regime Conclusion Barad et al lasix Netherlands 66, 8266 8273 2006

  2. topiramate increases and caffeine decreases sedation can i order generic cytotec pill 05 formulation in an emollient cream base Renova for topical treatment of photodamaged skin

  3. After further consideration, they re included five previously excluded studies Brettenthaler 2004; Carmina 2004; Khorram 2006; Pasquali 2000; Sahin 2004 does priligy work 1989 Feb 23; 320 8 485 90

  4. priligy alternative Filtrations were conducted using commercial Celite 545 EMD CX0574 1

  5. 写的真好。

回复 should metolazone be given before lasix 取消回复

您的邮箱地址不会被公开。 必填项已用 * 标注

About Me

一位程序员,会弹吉他,喜欢读诗。
有一颗感恩的心,一位美丽的妻子,两个可爱的女儿
mail: geraldlee0825@gmail.com
github: https://github.com/lisuxiaoqi
medium: https://medium.com/@geraldlee0825