vim编码格式及乱码产生原因

来源:互联网 发布:linux socket编程教程 编辑:程序博客网 时间:2024/04/30 15:07

1vim里面的编码主要跟三个参数有关:enc(encoding), fenc(fileencoding)和fencs(fileencodings)

enc作用是在当前系统中显示,默认值是当前系统编码,一般不改。在中文windows下,系统编码为cp936,enc默认也是cp936。在vim打开文件后,不管当前文件编码为何,将文件以enc的编码格式打开。用命令:set enc查看当前vim的enc是什么值。

fenc是文件编码格式。打开文件后,你可以通过改变fenc后再W来将此文件保存成不同的编码,如:set fenc=utf-8,然后:w就把文件存成utf-8,:set fenc=gb18030,就把文件存成gb18030。

fencs:在打开文件时vim会把fencs中编码的顺序进行解码操作,如果匹配成功,则用该编码解码,并把这种编码设为fenc的值。

2Vim 的多字符编码方式支持是如何工作的
1. Vim 启动,根据 .vimrc 中设置的 encoding 的值来设置 buffer、菜单文本、消息文的字符编码方式。 
2. 读取需要编辑的文件,根据 fileencodings 中列出的字符编码方式逐一探测该文件编码方式。并设置 fileencoding 为探测到的,看起来是正确的 字符编码方式。 
3. 对比 fileencoding 和 encoding 的值,若不同则调用 iconv 将文件内容转换为encoding 所描述的字符编码方式,并且把转换后的内容放到为此文件开辟的 buffer 里,此时我们就可以开始编辑这个文件了。注意,完成这一步动作需要调用外部的 iconv.dll,你需要保证这个文件存在于 $VIMRUNTIME 或者其他列在 PATH 环境变量中的目录里。 
4. 编辑完成后保存文件时,再次对比 fileencoding 和 encoding 的值。若不同,再次调用 iconv 将即将保存的 buffer 中的文本转换为 fileencoding 所描述的字符编码方式,并保存到指定的文件中。同样,这需要调用 iconv.dll。

3乱码产生的原因

根据 fileencodings 中列出的字符编码方式逐一探测该文件编码方式时,或者fileencodings中没有正确的编码,或者有正确的编码但顺序不对,导致fenc不对,结果vim将不正确的fencd转换为enc。

解决乱码举例:
1. 一个文件,在windows下用gvim打开正常,在linux 用vim打开乱码。
观察:windows 下,查看. encoding(cp936), fileencoding(cp936), termencoding()
    linux (乱码), 查看 encoding(utf-8), fileencoding(latin1), termencoding()
分析:是fileencoding 检查出错所致, 但是查看 fileencodings 设置, gvim(windows) 和 vim(linux) 都是
    set fileencodings=utf-8,utf-16,cp936,cs-bom,latin-1
    可见在linux 下并没有真正检测出文件编码类型为 cp936(虽然它在前面), 而误认为latin-1

解决办法:
    1.指定以cp936格式重新加载文件。 e ++enc=cp936
      注意。不是:set fileencoding=cp936,因为那只是把文件保存为cp936,打开时逐一探测该文件编码方式,仍旧误判为latin-1
    2. 搞定vim 文件编码判定过程, 例如在首行添加一个中文。例如: //中文, 就能正确识别。推荐此法
    总之,搞清这三个变量,可解决乱码问题。

原创粉丝点击