电子邮件是Internet上最古老的服务,但直到今天,它仍然充满活力,许多新的服务如ftpmail、Mailing List、新闻组等也都是从电子邮件发展而来的。但对于中文用户来说,乱码问题可能困扰着许多用户。我平均每天要收几十封信,几乎每天都要遇到这种问题。如果你也有类似的遭遇,不妨照我说的试试。
乱码由何而来呢?这要从Internet的历史谈起,Internet上的函件协议是1982年定义的,那时的函件主要由英语文本组成,因而函件协议只支持简单的ASCII文本也就不足为奇了。随着Internet的广泛应用,传递的数据也已经不局限于简单的英语文本,这就需要有一种办法允许在函件消息中传递二进制数据,而又不违背当初的协议标准。把二进制数据转换为文本数据叫编码(encode),反之称为解码(decode)。目前编码的标准有很多,如UU、MIME等等。如果收发双方都使用同一种编码/解码方法,那不会有任何问题出现,但如果发送方采用一种方法,而接受方不能识别这种方法,就会出现乱码。如果是一个单位内部的函件系统,可以规定所有人使用同一种编码/解码方式,可在Internet上情况就复杂多了。你可能会收到素不相识的人的来信,他(她)可能使用很特殊的函件软件或操作系统。有的函件在传输过程中还会被进行特别的处理,也可能会对数据进行编码。所以除非你只与自己的好朋友通信(这样的话,Internet又有什么意义呢?),你早晚会遭遇到这个问题。
怎么解决乱码问题呢?
首先是设置好你的函件软件。许多函件软件允许你选择函件的编码/解码方式,最好选择MIME(Multipurpose Internet Mail Extension),这是目前使用最广返的协议。如果你的函件程序不支持这种协议,你应该考虑换一个软件了。
不过,MIME包括不只一种编码/解码方案,其1.0版包括五种标准编码方式,在实际使用中还出现了一些厂商定义的方案。目前使用最多的是base64编码,它将每3个8位的字节转换为4个用ASCII码表示的6位字节,这种方法会使文件长度增加三分之一。下面就是用base64编码的ZIP文件(片段):
Content-Type: application/x-zip-compressed; name="ACTIVEX.ZIP"
Content-Transfer-Encoding: base64
Content-Disposition: inline; filename="ACTIVEX.ZIP"
UEsDBBQAAgAIAGt/5yIVq5UiVBMAAAA4AAALAAAAQUNUSVZFWC5ET0PtO2twXNV5ZyUZ/EDYgAHHTajCGCpNQDWEuCmExsY2wY2NwXhwZkrasbGondoSY8shSacdZkr5kclM6UwnQ2eatHevMfJqbe+u7tU+7j6119rVvdrdq93VXVnIIEt+PwSWwULWw/2+c/Z6H1rZMmUykPpqPp37+M45
另外一种使用得比较多的是quoted-printable,象Lotus的cc:mail就使用这种方式。这种编码是把8位的字符转换成一个等号加上两个该字符的16进制值。这种方法非常简单,特别适合那些数据大多数是7位ASCII文本,偶尔插入8位字母的情况,但对汉字编码效果不够好,因为每个双字节汉字经过编码后会变成6个字节。下面这段是我从CERNet的Internet in China讨论组(iic-l@iic.edu.cn)收到的一封函件的片段,它采用的就是quoted-printable编码:
Date: Thu, 31 Jul 1997 07:34:12 -0800 (GMT)
From: aaoaaaoa@pub.nj-online.nj.js.cn
To: iic-l@iic.edu.cn
Subject: Contribution about Chinese Stock Market
Message-ID: <199707311534.HAA10434@pub.nj-online.nj.js.cn>
=A1=A1=A1=A1=A1=A1=A1=A1=A1=A1=A1=
=A1=BC=C6=BB=AE=CF=C2=B5=C4=D6=D0=B9=FA=B9=C9=CA=D0
=CF
=A1=A1=A1=A1=C6=DF=D2=BB=CF=E3=B8=DB=BB=D8=B9=E9=A3=AC=BE=D9=B9=FA=BB=B6=C7=
=EC=A1=A3=C8=BB=B6=F8=A3=AC=B1=BE=D3=A6=BD=E8=B4=CB=B6=AB=B7=E7=B8=FC=C9=CF=
=D2=BB=B2=E3=C2=A5=B5=C4=BB=A6=C9=EE=B9=C9=CA=D0=C8=B4=D2=D4=C1=AC=D0=F8=B2=
在实际使用中,这种编码还有一种变形,即用“%”号代替“=”号。例如,我的主页有一个“问题与解答”专栏,访问者可以在主页上输入问题,该问题就会被发送到我的邮箱里,下面就是一个问题的片段:
name=+%B0%A2%D6%BE&email=tjjnet@netchina.co.cn&comment=+1%A1%A2%D4%DAWIN
由此可见,如果你的函件程序不能支持所有的MIME编码方式,那么即使双方都使用MIME协议,仍有可能出现乱码。
去除乱码的另一个方法就是选择一种能支持多种编码/解码的软件。这样的软件有不少,但笔者最偏爱的是ESS Code,你可以在www.hotfiles.com找到它。它支持UU、MIME、SHIP、BTOA等多种方案。如果你需要将二进制文件转换为文本文件,可以使用菜单上的UUEncode、MIME-Encode、SHIP-Encode和BTOA-Encode;反之,使用UUDecode、MIME-Decode、SHIP-Decode和BTOA-Decode。ftpmail(使用函件来执行ftp命令)的服务器可能会把大文件分成几个小部分发送给你,而ESS Code支持文件的合并与分解,这样使用起来就很方便了。
仅有这两方面的工作还是不够的,因为ESS Code和函件程序都是根据一定的标志来识别编码方式,但有的函件(如上面提到的Internet in China函件)没有相应的标志,这样的文件ESS Code不能处理。对于此类文件你需要加上一个标志头。MIME的标志头中影响编码的有三行:第一行是Content-Type,它表明文件的类型,象前面的application/x-zip-compressed表明是一个ZIP压缩文件,text/plain表示普通文本文件;第二行Content-Transfer-Encoding表示编码方式;第三行Content-Disposition表示编码文件的位置。为了解码Internet in China函件,我们可以先在函件前面加上三行:
Content-Type: text/plain; name="iic-l51.txt"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline; filename="iic-l51.txt"
这样处理后,ESS Code就可以正确解码了。这里的iic-l51.txt是我自己起的名字,ESS Code会自动以此名保存解码后的文件。
如果你嫌每次都这样加上标志太麻烦,也可以从我的主页上下载Zeal Decoder V1.0,这个程序不需要标志头就可以解码,但它只处理quoted-printable编码的文件。如命令
zdecode iic-l51 iic-l51.txt
可以将iic-l51文件解码为iic-l51.txt。如果使用的引导字符不是“=”,而是“%”,可以使用下面的命令
zdecode iic-l51 iic-l51.txt %
但愿我的这些雕虫小技对你畅游Internet有所帮助。
如果您有任何建议,请给我发电子邮件:
。
版权所有 李海,热情软件屋 1997-2006