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. 使用postMessage进行react和iframe的数据通信.md

    将react的数据传递给iframe 1.首先在父组件(react文件)内引入iframe <iframe style={{border:0,width:"100%",hei ...

  2. redhat/centos使用service控制启动与关闭

    原文地址: http://guodong810.blog.51cto.com/4046313/1285353 有时,我们自己安装了某个软件时,想让对这个服务更加容易的控制,在redhat/centos ...

  3. extjs 事件监听 三种方式

    xtype : 'textarea', name : 'dataSetField', labelSeparator:'', fieldLabel:'', hideLabel: true, allowB ...

  4. Java Web开发基础(2)-JSP

    上一篇博我粗略的介绍了一下Servlet.粗略是由于博主也刚刚学习这部分的内容,还不是非常懂所以无法讲的非常精细.可是本着二八原则,我还是先继续学习.所以,这篇博客接着JSP的内容.由于.这两个内容关 ...

  5. appium+python自动化53-adb logcat查看日志

    前言 做app测试,遇到异常情况,查看日志是必不可少的,日志如何输出到手机sdcard和电脑的目录呢?这就需要用logcat输出日志了 以下操作是基于windows平台的操作:adb logcat | ...

  6. shader内置变量

    内置变量都在UnityShaderVariables.cginc文件中声明 变换矩阵 All these matrices arefloat4x4 type. Name Value UNITY_MAT ...

  7. 学习笔记:状态压缩DP

    我们知道,用DP解决一个问题的时候很重要的一环就是状态的表示,一般来说,一个数组即可保存状态.但是有这样的一些题 目,它们具有DP问题的特性,但是状态中所包含的信息过多,如果要用数组来保存状态的话需要 ...

  8. how to configure logback for Mybatis to print my SQL

    To log SQL statements for particular mybatis mapper set DEBUG (TRACE to see query parameters and res ...

  9. OpenCV学习(18) 细化算法(6)

    本章我们在学习一下基于索引表的细化算法. 假设要处理的图像为二值图,前景值为1,背景值为0. 索引表细化算法使用下面的8邻域表示法: 一个像素的8邻域,我们可以用8位二进制表示,比如下面的8邻域,表示 ...

  10. socket函数send和recv函数

    转自:http://www.cppblog.com/aaxron/archive/2012/04/27/172891.html 在发送端,一次发送4092个字节,在接收端,一次接收4092个字节,但是 ...