瑞星卡卡安全论坛

首页 » 技术交流区 » 系统软件 » 消除电子函件的乱码
折子戏 - 2005-8-21 21:46:00

    电子函件是Internet上最古老的服务,但直到今天,它仍然充满活力,许多新的服务如ftpmail、MailingList、新闻组等也都是从电子函件发展而来的。但对于中文用户来说,乱码问题可能困扰着许多用户。我平均每天要收几十封信,几乎每天都要遇到这种问题。如果你也有类似的遭遇,不妨照我说的试试。

    乱码由何而来呢?这要从Internet的历史谈起,Internet上的函件协议是1982年定义的,那时的函件主要由英语文本组成,因而函件协议只支持简单的ASCII文本也就不足为奇了。随着Internet的广泛应用,传递的数据也已经不局限于简单的英语文本,这就需要有一种办法允许在函件消息中传递二进制数据,而又不违背当初的协议标准。把二进制数据转换为文本数据叫编码(encode),反之称为解码(decode)。目前编码的标准有很多,如UU、MIME等等。如果收发双方都使用同一种编码/解码方法,那不会有任何问题出现,但如果发送方采用一种方法,而接受方不能识别这种方法,就会出现乱码。如果是一个单位内部的函件系统,可以规定所有人使用同一种编码/解码方式,可在Internet上情况就复杂多了。你可能会收到素不相识的人的来信,他(她)可能使用很特殊的函件软件或操作系统。有的函件在传输过程中还会被进行特别的处理,也可能会对数据进行编码。所以除非你只与自己的好朋友通信(这样的话,Internet又有什么意义呢?),你早晚会遭遇到这个问题。

    怎么解决乱码问题呢?

    首先是设置好你的函件软件。许多函件软件允许你选择函件的编码/解码方式,最好选择MIME(MultipurposeInternetMailExtension),这是目前使用最广返的协议。如果你的函件程序不支持这种协议,你应该考虑换一个软件了。

    不过,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的InternetinChina讨论组(iic-l@iic.edu.cn)收到的一封函件的片段,它采用的就是quoted-printable编码:

    Date:Thu,31Jul199707:34:12-0800(GMT)

    From:aaoaaaoa@pub.nj-online.nj.js.cn

    To:iic-l@iic.edu.cn

    Subject:ContributionaboutChineseStockMarket

    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协议,仍有可能出现乱码。

    去除乱码的另一个方法就是选择一种能支持多种编码/解码的软件。这样的软件有不少,但笔者最偏爱的是ESSCode,你可以在www.hotfiles.com找到它。它支持UU、MIME、SHIP、BTOA等多种方案。如果你需要将二进制文件转换为文本文件,可以使用菜单上的UUEncode、MIME-Encode、SHIP-Encode和BTOA-Encode;反之,使用UUDecode、MIME-Decode、SHIP-Decode和BTOA-Decode。ftpmail(使用函件来执行ftp命令)的服务器可能会把大文件分成几个小部分发送给你,而ESSCode支持文件的合并与分解,这样使用起来就很方便了。

    仅有这两方面的工作还是不够的,因为ESSCode和函件程序都是根据一定的标志来识别编码方式,但有的函件(如上面提到的InternetinChina函件)没有相应的标志,这样的文件ESSCode不能处理。对于此类文件你需要加上一个标志头。MIME的标志头中影响编码的有三行:第一行是Content-Type,它表明文件的类型,象前面的application/x-zip-compressed表明是一个ZIP压缩文件,text/plain表示普通文本文件;第二行Content-Transfer-Encoding表示编码方式;第三行Content-Disposition表示编码文件的位置。为了解码InternetinChina函件,我们可以先在函件前面加上三行:

    Content-Type:text/plain;name="iic-l51.txt"

    Content-Transfer-Encoding:quoted-printable

    Content-Disposition:inline;filename="iic-l51.txt"

    这样处理后,ESSCode就可以正确解码了。这里的iic-l51.txt是我自己起的名字,ESSCode会自动以此名保存解码后的文件。

    如果你嫌每次都这样加上标志太麻烦,也可以从我的主页http://www.nease.net/~zealsoft上下载ZealDecoderV1.0,这个程序不需要标志头就可以解码,但它只处理quoted-printable编码的文件。如命令

    zdecodeiic-l51iic-l51.txt

    可以将iic-l51文件解码为iic-l51.txt。如果使用的引导字符不是“=”,而是“%”,可以使用下面的命令

    zdecodeiic-l51iic-l51.txt%

    但愿我的这些雕虫小技对你畅游Internet有所帮助。
1
查看完整版本: 消除电子函件的乱码