VIM显示utf-8文档乱码解决方法

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的时候,一定要把要求严格的、当文件不是这个编码的时候更容易出现解码失败的编码方式放在前面,把宽松的编码方式放在后面。例如,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的工作原理

好了,解释完了这一堆容易让新手犯糊涂的参数,我们来看看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文档乱码解决方法

时间: 2024-10-17 21:06:54

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

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

在文档集界面中显示Word文档,是文档大师的一个核心功能. 最近在 Win10 升级到最新版后,发现 无法正常显示Office 文档的问题. 一开始以为是Word版本问题,从2007升级到2016,问题仍没解决. 用关键字“ie11 word 显示不全”搜索,看了几个搜索结果,找到了答案:"关闭IE11". 操作: 1. Win10 控制面板,在卸载软件界面左边栏有“打开和关闭win功能”,打开后将IE前面的对勾去掉 2.重启机器后,打开文档大师,显示正常了. 当然,问题的本质是Win

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

不光是Delphi,Windows里面所有的之所以无法打开.hlp帮助文档的问题都可以使用以下的方法来解决 问题:情况是这样的,不是打不开hlp帮助文档,按F1出现的是Windows的帮助.而Delphi的帮助也是F1,当我打开Delphi环境时,按F1不打开Delphi的帮助,而是打开windows的帮助.我需要按F1出Delphi的帮助,可气的是,点帮助图标仍然显示的是windows帮助. 原因:Windows缺少一个补丁 解决方法:下载这个压缩包,解压后,根据你的电脑版本选择其中的x64或

Zabbix显示中文或图片为乱码--解决方法

Web UI 修改为中文: 1.进行zabbix系统后选择:Administration,在子菜单中选择:Users: 2.在最右列的:User groups更改为Users; 3.选择:Admin 点击 4.在下面的:Language中选择:Chinese(zh_CN) 5.点击:Save 6.刷新网页即可 如果还是不行可以尝试以下方法: # sed -i '/zh_CN/ s/false/true/' /var/www/html/zabbix/include/locales.inc.php 

cocos2d-x 3.0 使用Sax解析xml文档(解决中文显示问题)

今天是个好日子,心想的事儿都能成,明天是个好日子,打开了家门儿迎春风... 恩,听着歌写文档生活就是这么享受. 今天以前的邻居大神突然在qq上赞了我一下,这让我异常激动啊..这还要从前前前几天说起,那会无意间看到cocos微信上的一个实话实说活动,反正就是参加了可以抽奖这样子啦,没错,我就是本着那官方T恤去的,本着分子越大分母越大抽奖几率越大的原则,然后就连着发了一番感慨,而且还都是比较罗嗦,没想到隔天cocos君竟然给我回复了,中奖了有木有,cocos2dx的官方T恤,哈哈..然后就是以前的大

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

vim是一个功能超级强大的编辑器,当然我们也可将它配置超强的IDE.这类教程网上非常多,我就不再此赘述了. 我们在使用中对不熟悉的命令,不熟悉的插件的使用方法常常须要查看文档,全英文环境确实看着人头都大了.为此,特地 找了个汉化的文档,,点击这里能够下载文件. 首先我们应在用户主目录下建立.vim/目录.vimrc隐藏文件,并依次建立.vim/doc/      .vim/plugin 目录 [plain] view plaincopyprint">? mkdir ~/.vim mkdir

ASP页面显示乱码解决方法/ASP设置编码

ASP页面显示乱码解决方法/ASP设置编码(转) 如果你发现浏览页面的时候出现乱码.你可以尝试一下步骤: 确保你页面本身编码格式正确:例如test.asp中使用charset=utf-8,那么请先确保这个文件本身就是Utf-8编码的.你可以利用记事本 进行转换.同样如果使用charset=GBK,请先确保这个文件本身就是GBK编码的. 确认你得到的原数据(例如从数据库中得到的数据)编码方式与页面编码方式一至. 尝试指定IIS按什么编码读取. <%@ codepage=65001%>UTF-8

c#写入Mysql中文显示乱码 解决方法 z

mysql字符集utf8,c#写入中文后,全部显示成?,一个汉字对应一个? 解决方法:在数据库连接字符串中增加字符集的说明,Charset=utf8,如 MySQLConnection con = new MySQLConnection("server=127.0.0.1;uid=root;pwd=;database=test;Charset=utf8"); 搞定 c#写入Mysql中文显示乱码 解决方法 z,布布扣,bubuko.com

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

前言: 你先得知道HelpPageConfig文件,不知道说明你现在不需要这个,所以下文就不用看了,等知道了再看也不急.当然如果你很知道这个,下文也不用看了,因为你会了. 方法一: new XmlDocumentationProvider(HttpContext.Current.Server.MapPath("~/App_Data/Documentation.xml")) 替换成 new XmlDocumentationProvider("PluginsFolder/*.xm

Hybrid----使用UIWebView显示PDF等文档

App中若需要显示pdf.word文档,这时候没有其他控件,比UIWebView更适合,它高度抽象了技术细节,可以很简单的使用 UIWebView可打开文件类型列表 (需要iOS3.0系统以上) 可以看到Excel.PPT.PDF.Word都可打开. 点击可下载打开PDF的Demo 将UIWebView加入到界面,获得源文件路径,打开文件 NSString *path = [[NSBundle mainBundle] pathForResource:@"Swift" ofType:@&