vim 设置字符集,vim默认编码
VIM字符集编码设置_冰水_新浪博客
VIM字符集编码设置
(2012-09-27 21:29:45)
标签:
它
分类:Linux
安装中文语言包支持后,Ubuntu的默认区域设置是zh_CN。UTF-8(即简体中文区域设置,字符集内码UTF-8)。这和我们日常开发环境中Unix设置的环境不同。我们日常的环境一般都是zh_CN。GBK或zh。我们的源代码文件的字符编码也是GBK编码。用默认VIM直接在Ubuntu下打开后,中文评论会出现乱码。如果你直接编辑这个文件并提交,那么在Unix下开发的其他同事会把这个源代码签出并打开,它也会显示乱码(你的新中文内容会乱码)。
解决这个问题至少有两种方法:一种是添加zh_CN新的区域设置支持。GBK为Ubuntu,内码使用GBK;另一个是通过设置VIM,在不改变Ubuntu支持的区域设置的情况下,支持读写GBK内部代码文件(内部代码仍然是UTF-8)。
简单地说,第一种方法包括四个步骤:
第一步:sudovi/var/lib/locales/supported . d/local。这个文件的原始状态只有一条记录:zh _ cn . utf-8 utf-8;为了增加zh_CN的区域设置。GBK,我们在这个文件的末尾加一行:zh _ cn.gbkgb,保存并退出。
第二步:执行sudo locale-gen来生成对应于zh_CN的区域设置。商业版
步骤3:编辑:/etc/environment并在文件末尾添加以下内容:
LANGUAGE=zh_CN:zh:en_US:en
LANG=zh_CN。商业版
LC_CTYLE=zh_CN。商业版
LC_ALL=zh_CN。GBK的
第四步:重启Ubuntu系统。重启后,用VIM打开之前GBK编码的源代码文件,不会出现乱码。默认情况下,编辑文件仍由GBK编码。不会影响别人在其他平台读写文件。
第二种方法是本文的重点。也就是在zh_CN的环境下。UTF-8,GBK编码文件的正确读写是有保证的。主要问题是:如何读取和正确显示带有特定字符码的已有文件,以及如何根据特定字符码编写新文件。
这里有两个数据文件:data1和data2,都是“祖国60华诞快乐”。然而,数据1是用UTF-8编码的,而数据2是用GBK编码的。您可以使用od -x来检查文件中存储的实际数据是否不同。
od -x数据1
0000000 a5e 7 e79d 96a 5 9be 5 e5bd ad85 8de 5 e581
0000020 b4b 9 94e 7 e69f a597 bfe 5 e4ab 90b 9 000 a
0000037
od -x数据2
0000000 a3 D7 E6 D7 fab 9 F9 C1 aeca ea C4 fac 9 D5 c8
0000020 ecbf d6c0 000a
0000025
在终端UTF-8编码的前提下,LC_ALL=zh_CN。UTF-8,VIM默认配置,用VIM尝试打开data1和data2,发现data1显示正常,data2显示乱码;为什么?这里,当打开一个现有文件时,VIM将有一系列的过程:
当用VIM打开一个现有文件时,VIM应该首先检查fileencodings(或fencs)选项。fileencodings是一系列字符编码格式的列表,比如:set fileencodings=gbk,utf-8,gb18030,UCS-BOM,cp936。此选项仅在打开现有文件时有效。如果没有在。vimrc,fileencodings的默认值是‘UCS-BOM,UTF- 8,default,latin1’,其中默认值是用户环境的默认编码格式。
当你打开一个已经存在的文件时,VIM会使用fileencodings值列表中的编码格式逐个检测文件的编码模式,直到两者一致。成功检测之后,VIM将使用匹配的编码格式来设置这个文件会话的fileencoding选项值。fileencoding选项表示在将数据写入文件或从文件中读取数据时,该会话的VIM缓冲区中数据的编码格式。同样,本次会话中VIM缓冲区中数据的编码格式由另一个选项表示,即编码选项。这里有很多选项带有 encoding-like 字样,很容易混淆。但实际上,在VIM文件操作过程中真正起到显示和保存数据作用的选项只有两个:fileencoding和encoding。fileencoding只是一个外围选项,用于在打开现有文件时检测和设置file encoding字段。VIM的编码转换也围绕着两个选项,fileencoding和encoding。无论是读文件还是写文件,当一个VIM会话中fileencoding和encoding的值不一致时,VIM会自动进行编码转换。比如读取一个文件,当session的fileencoding是UTF-8,编码是GBK时,VIM会自动将文件中的数据从UTF-8转换到GBK,并将转换后的数据存储在VIM的BUFFER中供该会话使用;同样,当创建一个新文件时,如果这个会话的vim缓冲区中的数据的编码格式(编码指令)与fileencoding指令不一致,那么在保存文件时,VIM会根据fileencoding指示的编码格式自动转换缓冲区中的数据,然后存储在新文件中。
每个选项有三种状态:显式设置、空(编码除外)和默认。显式设置是指中选项的赋值设置。vimrc或在会话中使用set指令;空:特殊,表示该选项的值为空;默认值是未在中分配选项的状态。vimrc或通过set在会话中。
当fileencodings为空时,设置file encodings=“”;英寸vimrcVIM将无法检测文件编码,会根据FileNodeding和encoding的值直接确定文件编码和缓冲区编码,以及是否需要自动编码转换;当fileencodings不为null,但fileencoding检测失败时,VIM会将本次会话的fileencoding设置为null,然后根据编码值设置文件编码和VIM缓冲区编码。
fileencoding的默认值为空(“”)。打开现有文件时,可以通过fileencodings设置其值。当你创建一个新文件时,如果fileencoding是默认值或者为空,那么编码将决定一切。显式设置的值仅在新创建文件的会话中有效。
编码是核心,是VIM会话中缓冲区数据的编码,也可以理解为VIM核心的内部代码;VIM将根据它与fileencoding和TERM encoding ($ TERM的编码格式)的差异自动进行代码转换。编码默认为$LANG。
下面举几个例子来说明VIM的行为模式。测试环境Ubuntu 9.04,lang=zh _ cn.utf-8,data1和data2如上所述。
(1)这三个选项都是默认值,没有在下显式设置。vimrc。
此时,在VIM会话建立之前,fileencoding的默认值为“ucs-bom,UTF- 8,默认,latin1”,file encoding为空,encoding=UTF-8($LANG)。打开data1,vim将探测文件编码。成功匹配UTF-8编码格式,并将fileencoding设置为UTF-8。此时,编码也是UTF- 8,这两者是一致的。VIM不进行编码转换,屏幕正确显示“祖国六十华诞快乐”。打开data2,VIM通过fileencodings检测,但无法匹配GBK的编码,设置fileencoding为null,编码工作,VIM不做任何编码转换,显示UTF-8格式的GBK编码数据,屏幕显示乱码。
(2)文件编码明确设置为“UTF-8,GBK”,其他选项采用默认值。
此时,在vim会话建立之前,fileencoding的值为“UTF-8,GBK”,file encoding为空,encoding=UTF- 8($LANG)。打开data1时,VIM通过fileencodings进行检测,成功匹配了UTF-8的编码格式。将fileencoding设置为UTF-8,此时编码也是UTF-8,两者一致。VIM不进行编码转换,屏幕正确显示“祖国六十华诞快乐”。打开data2,VIM通过fileencodings检测,成功匹配GBK的编码,并将fileencoding设置为GBK。此时,编码是UTF-8,这是不同于其他两个。VIM执行自动编码转换,将GBK编码的数据转换为UTF-8格式,放入缓冲区并显示。屏幕正确显示“祖国60岁生日快乐”,VIM在状态栏提到“已转换”。
(3) fileencoding显式设置为“GBK”,encoding显式设置为“UTF-8”或采用默认值。
新建一个文件data3,输入“祖国60华诞快乐”,保存。此时,fileencoding和encoding值不一致。VIM执行自动编码转换,将缓冲区中的UTF-8编码数据转换为GBK编码并存储在文件中。VIM状态栏提示“已转换”。从VIM出口出去。Od -x数据3,输出是GBK码。
转载自:
http://bigwhite.blogbus.com/logs/47259473.html
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。