1.相关基础知识介绍

在Vim中。有四个与编码有关的选项,它们是:fileencodings、fileencoding、encoding和termencoding。

在实际使用中。不论什么一个选项出现错误。都会导致出现乱码。

因此,每个Vim用户都应该明白这四个选项的含义。以下,我们具体介绍一下这四个选项的含义和作用。



        (1)encoding

        encoding是Vim内部使用的字符编码方式。当我们设置了encoding之后。Vim内部全部的buffer、寄存器、脚本中的字符串等,全都使用这个编码。Vim 在工作的时候。假设编码方式与它的内部编码不一致,它会先把编码转换成内部编码。假设工作用的编码中含有无法转换为内部编码的字符,在这些字符就会丢失。因此,在选择 Vim 的内部编码的时候,一定要使用一种表现能力足够强的编码,以免影响正常工作。

        因为encoding选项涉及到Vim中全部字符的内部表示,因此仅仅能在Vim启动的时候设置一次。

在Vim工作过程中改动encoding会造成许多的问题。用户手冊上建议仅仅在 .vimrc中改变它的值,其实似乎也仅仅有在 .vimrc中改变它的值才有意义。

假设没有特别的理由,请始终将encoding设置为utf-8。为了避免在非UTF-8的系统如Windows下,菜单和系统提示出现乱码。可同一时候做这几项设置:

        set encoding=utf-8

        set langmenu=zh_CN.UTF-8

        language message zh_CN.UTF-8



        (2)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无法表示的字符时,这些字符就会丢失。

但假设使用后一种方法。尽管因为终端所限,这些字符无法显示,但在编辑过程中这些字符是不会丢失的。

        对于图形界面下的GVim,它的显示不依赖TERM,因此termencoding对于它没有意义。在GTK2下的GVim 中,termencoding永远是utf-8,而且不能改动。

而Windows下的GVim则忽略termencoding的存在。



        (3)fileencoding

        当Vim从磁盘上读取文件的时候。会对文件的编码进行探測。假设文件的编码方式和Vim的内部编码方式不同,Vim就会对编码进行转换。转换完成后,Vim会将fileencoding选项设置为文件的编码。

当Vim存盘的时候。假设encoding和fileencoding不一样,Vim就会进行编码转换。因此。通过打开文件后设置fileencoding。我们能够将文件由一种编码转换为还有一种编码。

可是,由前面的介绍能够看出,fileencoding是在打开文件的时候。由Vim进行探測后自己主动设置的。

因此。假设出现乱码,我们无法通过在打开文件后又一次设置fileencoding来纠正乱码。

简而言之,fileencoding是Vim中当前编辑的文件的字符编码方式,Vim保存文件时也会将文件保存为这样的字符编码方式 (无论是否新文件都如此)。



        (4)fileencodings

        编码的自己主动识别是通过设置fileencodings实现的,注意是复数形式。fileencodings是一个用逗号分隔的列表。列表中的每一项是一种编码的名称。

当我们打开文件的时候,VIM按顺序使用fileencodings中的编码进行尝试解码。假设成功的话,就使用该编码方式进行解码。并将fileencoding设置为这个值,假设失败的话,就继续试验下一个编码。

因此。我们在设置fileencodings的时候,一定要把要求严格的、当文件不是这个编码的时候更easy出现解码失败的编码方式放在前面,把宽松的编码方式放在后面。比如。latin1是一种很宽松的编码方式,不论什么一种编码方式得到的文本,用latin1进行解码。都不会发生解码失败——当然,解码得到的结果自然也就是理所当然的“乱码”。因此,假设你把latin1放到了fileencodings的第一位的话,打开不论什么中文文件都是乱码也就是理所当然的了。

下面是网上推荐的一个fileencodings设置:

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

        当中,ucs-bom是一种很严格的编码,非该编码的文件差点儿没有可能被误判为ucs-bom,因此放在第一位。

utf-8也相当严格,除了非常短的文件外(比如很多人津津乐道的GBK编码的“联通”被误判为UTF-8编码的经典错误),现实生活中一般文件是差点儿不可能被误判的,因此放在第二位。

接下来是cp936和gb18030。这两种编码相对宽松。假设放前面的话,会出现大量误判。所以就让它们靠后一些。cp936的编码空间比gb18030小,所以把cp936放在gb18030前面。

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

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

        假设编码被误判了。解码后的结果就无法被人类识别。于是我们就说,这个文件乱码了。

此时。假设你知道这个文件的正确编码的话,能够在打开文件的时候使用 ++enc=encoding 的方式来打开文件。如:

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



2.Vim的工作原理



        好了,解释完了这一堆easy让新手犯糊涂的參数,我们来看看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文件:

        在/home/username/.vimrc或者/root/.vimrc下添加两句话:

        let &termencoding=&encoding

        set fileencodings=utf-8,gbk,ucs-bom,cp936

        这样的办法能够实现编辑UTF-8文件



        (2)方法而二:打开文件后,在vi编辑器中设定:

        :set encoding=utf-8 termencoding=gbk fileencoding=utf-8



        (3)方法三:新建UTF-8文件,在vi编辑器设定:

        :set fenc=utf-8

        :set enc=GB2312

        这样在编辑器里输入中文,保存的文件是UTF-8。



        (4)方法四:一个推荐的~/.vimrc文件配置:

        set encoding=utf-8

        set fileencodings=ucs-bom,utf-8,cp936,gb18030,latin1

        set termencoding=gb18030

        set expandtab

        set ts=4

        set shiftwidth=4

        set nu

        syntax on



        if has('mouse')

        set mouse-=a

        endif

后记:本文依据网络上相关资料整理。因为来源较多,未能一一标明出处,敬请各位原创作者见谅。

VIM显示utf-8文档乱码解决方法的更多相关文章

  1. php------中文出现乱码解决方法

    中文出现乱码解决方法:原因编码格式不一致 [1]  建立数据库的时候,字符集选择utf-8  数据库,点表名,点右键,数据库属性…. [2]  修改myspl的配置,在[myspld]模块下面添加ch ...

  2. 文档大师 在Win10 IE11下,文档集画面无法正常显示Word等Office文档的解决方法

    在文档集界面中显示Word文档,是文档大师的一个核心功能. 最近在 Win10 升级到最新版后,发现 无法正常显示Office 文档的问题. 一开始以为是Word版本问题,从2007升级到2016,问 ...

  3. Delphi按下F1不能出现帮助文档的解决方法

    不光是Delphi,Windows里面所有的之所以无法打开.hlp帮助文档的问题都可以使用以下的方法来解决 问题:情况是这样的,不是打不开hlp帮助文档,按F1出现的是Windows的帮助.而Delp ...

  4. 打开PDF文件弹出阅读未加标签文档的解决方法

    在“高级”菜单的“辅助工具”选中“设置助手”,然后点选“设置屏幕阅读器选项”,下一步之后,将“忽略已加标签文档的阅读顺序”和“添加标签到文档之前进行确认”(有的版本显示的是“为文档加标签前确认”)前面 ...

  5. DEDECMS教程:织梦栏目更新HTML出现“模板文件不存在,无法解析文档”的解决方法(转)

  6. Linux vim 中文显示乱码解决方法

    因为在windows下默认是gb编码,而我的vim默认是utf-8(gedit默认也是utf-8),所以打开会成乱码.改动了一下配置文件,使vi支持gb编码就好了.$vi ~/.vimrclet &a ...

  7. [No0000190]vim8安装教程和vim中文帮助文档Vimcdoc安装方法-Vim使用技巧(5)

    Vim8.0是近十年来的一次大更新,支持任务.异步I/O.Channels和JSON以及异步计时器.Lambdas 和 Closures等,还包括对GTK + 3的支持.由于ubuntu默认安装的Vi ...

  8. ubuntu下vim及man帮助文档的汉化

    vim是一个功能超级强大的编辑器,当然我们也可将它配置超强的IDE.这类教程网上非常多,我就不再此赘述了. 我们在使用中对不熟悉的命令,不熟悉的插件的使用方法常常须要查看文档,全英文环境确实看着人头都 ...

  9. 从多个XML文档中读取数据用于显示webapi帮助文档

    前言: 你先得知道HelpPageConfig文件,不知道说明你现在不需要这个,所以下文就不用看了,等知道了再看也不急.当然如果你很知道这个,下文也不用看了,因为你会了. 方法一: new XmlDo ...

随机推荐

  1. spring---aop(2)---Spring AOP的JDK动态代理

    写在前面 spring 事务是springAOP 的一个实现.我们以分析spring的事务,来分析spring的AOP实现. 基本知识 如果目标方法被spring的事务声明,则执行该目标方法的对象就会 ...

  2. Vue集成微信开发趟坑:公众号以及JSSDK相关

    首先,类库方面,Vue中引入JSSDK的话,请引入weixin-js-sdk,而不是weixin-jsapi,原因在于weixin-jsapi不是最新版:还要注意JS接口安全域名,不需要http前缀, ...

  3. Go语言Web框架gwk介绍 (三)

    上一篇忘了ChanResult ChanResult 可以用来模拟BigPipe,定义如下 type ChanResult struct { Wait sync.WaitGroup Chan chan ...

  4. 记ie8及以下版本ie的flash的addCallback的一坑

    近来有一需求,播放声音,我在高端浏览器实现了html5 audio标签.低端浏览器实现了flash兼容.但是在调试ie8以下的浏览器发现js死活调不了flash里的addCallback的方法,总报错 ...

  5. Spring源码解析 – @Configuration配置类及注解Bean的解析

    在分析Spring 容器创建过程时,我们知道容器默认会加载一些后置处理器PostPRocessor,以AnnotationConfigApplicationContext为例,在构造函数中初始化rea ...

  6. Java学习笔记_22_Set接口的实现类

    22.Set接口的实现类: Set接口存放的元素是无序的且不包括反复元素. 1>实现类HashSet: HashSet类依据元素的哈希码进行存放,取出时也能够依据哈希码高速找到.HashSet不 ...

  7. 3D数学读书笔记——四元数

    本系列文章由birdlove1987编写,转载请注明出处. 文章链接: http://blog.csdn.net/zhurui_idea/article/details/25400659 什么是四元数 ...

  8. 2017微软 MVP 数据实践技术活动日(北京站)

    Power BI | 交互式数据可视化 BI 工具 EXCEL BI :无所不能的业务数据分析利器 EXCEL +POWERBI=EXCEL BI https://edu.hellobi.com/co ...

  9. 在gdb将所有线程的堆栈输出到文件中去

    http://m.blog.csdn.net/blog/lantianjialiang/40111253

  10. MVC批量更新,使用jQuery Template

    在"MVC批量更新,可验证并解决集合元素不连续控制器接收不完全的问题"中,当点击"添加"按钮的时候,通过部分视图,在界面上添加新行.本篇体验使用jQuery T ...