如何:
windows上默认为gb编码,我的vim默认为utf-8(gedit也默认为utf-8 ),所以打开后会乱码。 已修改配置文件,以便vi支持gb编码。
$VI~~/.vimrc
lettermencoding=encodingsetfileencodings=utf-8,gbk
$:wq
再次打开vi后,显示正常。
虚拟机编码基础知识:
存在1,3个变量:
编码——此选项用于缓冲区文本、正在编辑的文件、寄存器、Vim脚本文件等。
“编码”选项可以视为Vim内部行为机制的设置。
文件编码——此选项是vim写入文件时使用的编码方法。
term编码——此选项表示输出到客户端(term )的编码。
2,这三个变量的默认值:
编码——与系统的当前locale相同,因此在编辑文件时请考虑当前locale。 否则,要设定的东西会很多。
文件编码—- vim在打开文件时自动识别代码,而文件编码是识别的值。 如果为空,则在保存文件时使用编码编码。 如果未更改编码,则该值为系统的当前locale。
termencoding—-输出到终端时不使用默认的空值,即编码转换。
因此,编辑不同代码文件时需要注意的不仅是这三个变量,还有系统的当前locale和、文件本身的编码和自动代码识别以及客户在运行vim的终端上使用的代码类型这三个关键点
如果有人问:“为什么在vim中打开中文文档时出现乱码?
答案不确定。 理由已经说了,如果不清楚这三个重点和这三个变量的设定值,乱码发生是正常的,不乱码发生反而是偶然的。
让我们看看三个常用键的值以及这种情况下三个变量的值。
1,locale—目前大多数Linux系统都使用utf-8作为默认locale,但可能不是。 例如,一些系统使用中文本地
zh_CN.GB18030 如果locale为utf-8,则启动vim时将编码设置为utf-8。 这是兼容性最好的方法,因为它是内部的
使用utf-8进行处理时,无论外部存储代码如何,都可以进行完整的转换。 locale决定对vim的内部处理数据进行编码,即编码。
2 )文件编码和自动编码识别--这方面涉及各种编码规则,不详细论述。 但是,请注意,文件编码类型并不存储在文件中,也没有
用于记录文档是什么编码类型的说明性字段。 因此,在编辑文档时,必须知道该文档被保存时是用什么代码保存的,或者用其他方法判断代码类
类型,这一另一种手段是根据编码代码表的特征来判断。 例如,每个字符占用的字节数、每个字符的ascii值是否大于某个字段,以确定该文件属于哪个编辑
代码。 在这种方式中还使用了vim。 这就是vim的自动代码识别机制。 但是,由于该机制代码各种各样,所以不能对每个代码具有明显的特征来进行判别,因此是不可能的
百分之百准确。 关于我们GB2312编码,中文中使用了两个超过127个acsii值的字符构成汉字字符,因此与GB2312编码文件
由于latin1编码是区分的,自动识别编码的机制不会成功应用于gb2312,而是仅将文件识别为latin1编码。 gbk、big5也出现了这个问题
很高级。 因此,在编辑此类文档时,必须手动设置编码和文件编码。 如果文档编码为utf-8,则常规vim会自动识别正确的编码。
3、客户在运行vim的终端上使用的编码类型——和第二条一样,这也是比较难断定的关键。 第二个重点是决定从文件中读取和写入内容到文件中
中选择新的扶手类型,来修改默认的扶手。 此密钥确定vim将内容输出到终端时使用的编码。 如果此编码类型与终端接收的数据的编码类型不同,则会出现乱码问题。 在
在linux本地x环境中,一般终端认为接收的数据的编码类型与系统的locale类型相匹配,因此不需要在意这一点是否有问题。 但是,在涉及远程终端的情况下,例如
ssh登录服务器时,可能会出现问题。 例如,一个本地位置被称为GB2310系统(称为客户端) ssh,本地位置被称为utf-8系统)服务
服务器)并打开vim编辑文档,服务器返回的数据是utf-8,但客户端认为服务器返回的数据是gb2312,而未进行任何更改,然后按照
gb2312解释数据后,肯定会乱码。 在这种情况下,必须将termencoding设置为gb2312以解决此问题。 这个问题是我们的
windows
如果桌面计算机通过远程ssh登录服务器,则此处涉及到不同系统的编码转换问题。 因此,它与windows本身和ssh客户端有很大的相关性。 在
windows
下存在两种编码类型的软件,一种是本身就为unicode编码方式编写的软件,一种是ansi软件,也就是程序处理数据直接采用字节流,不关心编码。前一种程序可以在任何语言的windows上正确显示多国语言,而后一种则编写在何种语言的系统上则只能在何种语言的系统上显示正确的文字。对
于这两种类型的程序,我们需要区别对待。以ssh客户端为例,我们使用的putty是unicode软件,而secure CRT则是ansi
软件。对于前者,我们要正确处理中文,只要保证vim输出到终端的编码为utf-8即可,就是termencoding=utf-8。但对于后者,一方面
我们要确认我们的windows系统默认代码页为cp936(中文windows默认值),另一方面要确认vim设置的termencoding=
cp936。
处理中文文档最典型的几种情况和设置方式:
1,系统locale是utf-8(很多linux系统默认的locale形式),编辑的文档是GB2312或GBK形式的(Windows记事本
默认保存形式,大部分编辑器也默认保存为这个形式,所以最常见),终端类型utf-8(也就是假定客户端是putty类的unicode软件)
则vim打开文档后,encoding=utf-8(locale决定的),fileencoding=latin1(自动编码判断机制不准导致的),termencoding=空(默认无需转换term编码),显示文件为乱码。
解决方案1:首先要修正fileencoding为cp936或者euc-cn(二者一样的,只不过叫法不同),注意修正的方法不是:set
fileencoding=cp936,这只是将文件保存为cp936,正确的方法是重新以cp936的编码方式加载文件为:edit
++enc=cp936,可以简写为:e ++enc=cp936。
解决方案2:临时改变vim运行的locale环境,方法是以LANG=zh_CN vim
abc.txt的方式来启动vim,则此时encoding=euc-cn(locale决定的),fileencoding=空(此locale下文件
编码自动判别功能不启用,所以fileencoding为文件本身编码方式不变,也就是euc-cn),termencoding=空(默认值,为空则等
zgdby)此时还是乱码的,因为我们的ssh终端认为接受的数据为utf-8,但vim发送数据为euc-cn,所以还是不对。此时再用命令:
set termencoding=utf-8将终端数据输出为utf-8,则显示正常。
2,情况与1基本相同,只是使用的ssh软件为secure
CRT类ansi类软件。
vim打开文档后,encoding=utf-8(locale决定的),fileencoding=latin1(自动编码判断机制不准导致的),termencoding=空(默认无需转换term编码),显示文件为乱码。
解决方案1:首先要保证运行secure
CRT的windows机器的默认代码页为CP936,这一点中文windows已经是默认设置了。其他的与上面方案1相同,只是要增加一步,:set
termencoding=cp936
解决方案2:与上面方案2类似,不过最后一步修改termencoding省略即可,在此情况下需要的修改最少,只要以locale为zh_CN开
启vim,则encoding=euc-cn,fileencoding和termencoding都为空即为encoding的值,是最理想的一种情
况。
可见理解这3个关键点和3个参数的意义,对于编码问题有很大助力,以后就可以随心所欲的处理文档了,同时不仅仅是应用于vim,在其他需要编码转换的环境里,都可以应用类似的思路来处理问题解决问题。