Vim中编辑不同编码的文件的方法
先来说一下Vim中编码的基础内容:
Vim中存在3个与编码相关的变量:
- encoding - 用于buffer、script、register的编码设置,与system locale相同
- fileencoding - 写入文件的编码类型。如果为空,就使用encoding的设置,所以默认情况就是system locale
- termencoding -输出到terminal的编码类型。默认为空值,也就是输出到terminal的时候不做转换
文件的编码类型和自动识别:文件编码类型并非保存在文件内的,也就是说没有任何描述性的字段来记录文档是何种编码类型的。因此我们在编辑文档的时候,要么必须知道这文档保存时是以什么编码保存的,要么通过另外的一些手段来断定编码类型。这另外的手段,就是通过某些编码的码表特征来断定,例如每个字符占用的字节数,每个字符的ascii值是否都大于某个字段来断定这个文件属于何种编码。这就是vim的自动编码识别机制。但这种机制由于编码各式各样,不可能每种编码都有显著的特征来辨别,所以是不可能100%准确的。对于GB2312编码,由于其中文是使用了2个acsii值高于127的字符组成汉字字符的,因此不可能把gb2312编码的文件与latin1编码区分开来,因此自动识别编码的机制对于gb2312是不成功的,它只会将文件辨识为latin1编码。此问题同样出现在gbk,big5上等。因此在编辑此类文档时,需要手工设定encoding和fileencoding。如果文档编码为utf-8时,一般vim都能自动识别正确的编码。
客户运行vim的终端所使用的编码类型:这将决定vim输出内容到终端时使用的编码,如果此编码类型和终端认为它收到的数据的编码类型不同,则又会产生乱码问题。在linux本地X环境下,一般终端都认为其接收的数据的编码类型和系统locale类型相符,因此不需关心此方面是否存在问题。但如果牵涉到远程终端,例如ssh登录服务器,则问题就有可能出现了。例如从1台locale为GB2310的系统(称作客户机)ssh 到locale为utf-8的系统(称作服务器)并开启vim编辑文档。在不加任何改动的情况下,服务器返回的数据为utf-8的,但客户机认为服务器返回的数据是gb2312的,按照gb2312来解释数据,则肯定就是乱码了。这时就需要设置termencoding为gb2312来解决这个问题。此问题更多出现在windows desktop机远程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:Terminal和system locale都被设置为utf-8,但编辑的文件是GB2312或者GBK 编码的。这时在Vim通常会显示为乱码。(前面说过,这将导致Vim的自动编码识别把文件错误地识别为latin1。这时的encoding=utf-8,fileencoding=latin1,termencoding=<empty>。)
解决方法:修正fileencoding为对应的文件编码方式为cp936或者euc-cn(这两个是一个东西,只是名字不同):
- :edit ++enc=cp936
或者简写为
- :e ++enc=cp936
(注意不能用set fileencoding=utf-8这种方式,因为这种方式实际上是修改了文件保存的编码,而非load的编码)。
另一种方法是临时改变Vim启动环境的locale,设置LANG=zh_CN。此时的encoding=euc-cn
常见问题2:一台Windows主机上ANSI的程序SSH到system locale为utf-8的主机上,并编辑文件。(此时:encoding=utf-8,fileencoding=latin1,termencoding=<empty>)
解决方法:设置termencoding=cp936。或者用同样修改system locale(如上)。





在gooole搜了几篇,就你这篇写得最简洁清楚,多谢了