解决VIM显示utf-8文件乱码问题(3)


        至于big5、euc-jp和euc-kr,它们的严格程度和cp936差不多,把它们放在后面,在编辑这些编码的文件的时候必然出现大量误判,但这是Vim内置编码探测机制没有办法解决的事。由于中国用户很少有机会编辑这些编码的文件,因此我们还是决定把cp936和gb18030放在前面以保证这些编码的识别。

        最后就是latin1了。它是一种极其宽松的编码,以至于我们不得不把它放在最后一位。不过可惜的是,当你碰到一个真的latin1编码的文件时,绝大部分情况下,它没有机会fall-back到latin1,往往在前面的编码中就被误判了。不过,正如前面所说的,中国用户没有太多机会接触这样的文件。

        如果编码被误判了,解码后的结果就无法被人类识别,于是我们就说,这个文件乱码了。此时,如果你知道这个文件的正

确编码的话,可以在打开文件的时候使用 ++enc=encoding 的方式来打开文件,如:

        :e ++enc=utf-8 myfile.txt

2.Vim的工作原理

        好了,解释完了这一堆容易让新手犯糊涂的参数,我们来看看Vim的多字符编码方式支持是如何工作的。

        (1)Vim启动,根据 .vimrc中设置的encoding的值来设置buffer、菜单文本、消息文的字符编码方式。

        (2)读取需要编辑的文件,根据fileencodings中列出的字符编码方式逐一探测该文件编码方式。并设置fileencoding为探测到的,看起来是正确的字符编码方式。事实上,Vim 的探测准确度并不高,尤其是在encoding没有设置为utf-8时。因此强烈建议将encoding设置为utf-8,虽然如果你想Vim显示中文菜单和提示消息的话这样会带来另一个小问题。

        (3)对比fileencoding和encoding的值,若不同则调用iconv将文件内容转换为encoding所描述的字符编码方式,并且把转换后的内容放到为此文件开辟的buffer里,此时我们就可以开始编辑这个文件了。注意,完成这一步动作需要调用外部的iconv.dll(注2),你需要保证这个文件存在于$VIMRUNTIME或者其他列在PATH环境变量中的目录里。

        (4)编辑完成后保存文件时,再次对比fileencoding和encoding的值。若不同,再次调用iconv将即将保存的buffer中的文本转换为fileencoding所描述的字符编码方式,并保存到指定的文件中。同样,这需要调用iconv.dll

3.解决办法示例

        (1)方法一:设定.vimrc文件:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/1763.html