玩儿程序的都知道编码,其实大家并不想了解编码,我理解你们的心情,直到有天你遇到了乱码
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,这个世界就清净了
发表回复