2006年10月5日

E-MAIL 编码——雾里看花

    E-MAIL 一般在传送过程中都要对文件进行编码,因为 E-MAIL 只能传送 ASCII码格式的文字信息, ASCII 码为 7 位代码。非 ASCII 格式的文件在传送中必须经过编码工具编成相应的 ASCII 码进行传输,在接收到后接收端再根据编码规则进行解码。若非如此就很难在传输过程中出现编码截位的问题,导致收信方出现乱码,特 别是中文内码的文字,属于 8 位代码,并非标准的 ASCII 码形式,由于国内通行的大部分邮件服务器都能够处理 GB 内码文件,所以可以直接传送文件而不需要编码,但如果要将中文邮件发到国外或在某些不支持 8 位(非标准 ASCII 码格式)的某些邮件主机上传输,就会产生乱码。具体的说就是在直接发送中文或非 ASCII 码的邮件时邮件主机无法处理,便会把文件中每个字符的第八位都滤掉(截去第八位)从而使一些信息和原始信息截然不同,或邮件完全损坏成为乱码无法阅读。这也是目前造成邮件乱码的主要原因之一。而如果对邮件进行七位编码然后进行传输解码,就能解决截位乱码现象,使邮件准确无误。目前 E-MAIL 中一般采用 UU 、 MIME 、 BINHEX 三种编码标准,下面我们就来了解一下这几种标准。


    一、 UU 编码( unix - to - unix encoding )

    uuencode 和 uudecode 原来是早期 unix 系统使用的编解码程序,其内部所用算法为 Base64 后来被改写成为在 DOS 下运行的可执行程序。

    UU 使用方法为:在进行邮件发送前,在 dos 方式下先用 uuencode.exe程序将原文件编码成 ASCII 文件,然后再进行发送。收件人在接到后再用 uudecode.exe 程序将文件还原。

    这是 DOS 下的编码程序。在 windows 下类似的程序还有 wincode 和 winzip等, wincode 的使用原理同 DOS 下的 uuencode 、 uudecode 相同,只是利用了windows 的界面,从而使操作更为简便。 wincode 程序除支持 UU 编码外,同时支持mime , Binhex 等编码格式,应用范围颇为广泛。

    我们以上所介绍的 UU 编码并非只能对中文进行编码,任何你要寄出的文件包括..exe 等二进制文件都可按照编码——> 发送——> 收信——> 解码还原的步骤进行传送。

    二、 MIME ( Multipurpose Internet Mail Extention )标准的编码

    UU 编码解决了 E-MAIL 只能传送 ASCII 文件的问题,但我们可以从编解码的过程看出其运用并不很方便,因而随后又发展出一种新的编码标准即 MIME(Multipurpose Internet Mail Extention )译作“多媒体邮件传送模式”。顾名思义,这种编码标准支持传送多媒体文件,可在一封电子邮件中附加各种格式的文件一起发送。

    其实 MIME 定义的是一种编码规格,亦或可以说是一类编码的统称,能够符合MIME 标准的编码方式并非一种,而只要符合 MIME 规格便可顺利传送,在 MIME 定义下有两种编码方式 Base64 和 QP ( Quote-Printable ),QP 的规则是对资料中的 7位无须重复编码,仅将 8 位数据转成 7 位, QP 编码适用于非 ASCII 码的文字内容,例如我们的中文文件。而Base64 的规则是将整个文件重新编码成 7 位,通常适用
于传送二进制文件。

    一般编码方式不同会影响编码之后的文件大小,而采用 MIME 标准编码的E-MAIL 软件一般能自动判别你的邮件是采用何种编码,然后自动选择用 QP 或 Base64来解码。

    MIME 标准现已成为 Internet 电子邮件编码的主流。它的好处是以物体作为包装方式,可将多种不同文件一起打包后传送。发信人只要将要发的文件选好,它在传送时即时编码,收信人在收信时同时也是即时解码还原。完全自动化,非常方便。当然先决条件是双方的邮件软件都必须具有这项功能。使用这种方式发、收信双方所要做的工作就显得非常简单了,只须选定——> 寄出,其它的全部由电子邮件软件自动完成。由
于 MIME 的方便、可靠性,愈来愈多的电子邮件采用这种方式,我们最常见的 Netcape Mail , Internet Mail 等都是采用 MIME 方式。

    三、 BINHEX 编码较少见,主要用在 MAC 机上, PC 机上很少见,在此不做讲解。

    但当邮件传输时出现了由于 E-MAIL 编码不对而造成的乱码时, 我们要怎样识别和判断呢?

    我们都知道每种编码其格式都有其各自特征,这就给了我们一个判别的标志。我们可以根据这些特征进行编码判断。

    四、 UUENCODE 编码判断及解决。

    由于 UUENCODE 内部所用算法为 Base64 ,其格式为:
    begin 644 gx.zip Mig)0;....
    ...
    end

    其格式特征为在乱码之前会有“ begin xxx ”后紧跟被编码的原始文件名称,然后跟编码信件内容,在最后一行为“ end ”。

    根据这些特征我们可以判断出编码方式为 UUENCODE 方式,我们就可以使用一些相应 DECODE 软件解码。

    具体方法有:

    (1)、将 Uuencode “乱码”邮件转寄到自己的邮箱中,再使用能够支持UU 解码的电子邮件接收程序 ( 如 Eudora 、 OutLook Express 等)来接收该邮件。

    (2)、通过剪辑板将 Uuencode “乱码”存入文本文件,改文件名后缀为UE ,然后使用 Winzip 解码。

    (3)、将 Uuencode “乱码”存入一个文件,然后在 DOS 下用 uudecode.exe程序将文件解码。

    (4)、将 Uuencode “乱码”存入一个文件,然后在 Windows 下用 Wincode解码。

    Wincode 除支持 UU 编码外也支持 MIME 、Binhex 等编码格式,应用范围颇为广泛。

    五、 MIME 方式编码判断及乱码解决方法。

    (一)、 Base64 encode 编码判断

    Base64 大体格式为:
    MIME-Version:1.0
    Content-type:text/plain;Charset="us-ascii"
    Content-transfer-encoding;base64
    ....

    在乱码前一般有以下几部分“ 信头”:Content - type ( 内容及类型),Charset( 字符集)及 Content-Transfer-encoding( 内容传输编码方式)从以上信息非常好判断,解决方法有:

    (1)、将 Base64 encode “乱码”邮件存成一个文本文件,改文件名后缀为..UUE,然后使用 Winzip 解码。

    (2)、将 Base64 encode “乱码”邮件存成一个文件,将文件后缀改为..EML,由 OutLook Express 打开,就可以自动解码。

    (二)、 QP 编码判断

    QP 编码大体格式如下:
    =A1A=B1Z=A6N=A1I=AT=DA
    ....

    采用 QP 编码的信件也很容易判断,只要乱码内容有很多符号“ = ”就可判断为 QP 编码, QP 乱码解决方法有:

    (1)、将 QP-encode “乱码”邮件转寄到自己的邮箱中,然后用支持 QP 解码的电子邮件接收程序(如 Netscape mail 、 Eudora 、 OutLook Express 、 Becky等)来接收该邮件。

    (2)、使用 Winzip 对 Quoted-Printable 解码。必须注意 :
    (a) 在邮件信头中检查、添加这样两行 : Mime-Version : 1.0 Content-Transfer-Encoding: quoted-printable ;
    (b) 信头中间不要空行,信头和信体之间要有一个空行。这样形成的文件,改后缀名为 UUE ,即可双击启动 Winzip 得到解码。

    除了上述编码造成乱码外,还有以下两种常见乱码:

    (一) HZ 中文乱码

    由于网友们可能使用不同的电子邮件收发软件,因此,来自各个网友的邮件内容可能包含着看不懂的乱码,例如,如果看到下面这串乱码 ,你一定看不懂它的意思:HZ- 学软件、用软件、买软件的好伴侣实际上这是一串“简体中文 HZ ”编码,如果使用 Outlook Express 发送邮件时,选用 HZ 编码,而邮件的接收者使用 Eudora 来阅读邮件,看到的就是这些乱码 。正确的方法是,在撰写邮件窗口中,选择“格式”菜
单下的“语言”命令,并选中“简体中文 ( GB2312 ) ”项,然后发送邮件。这时,如果你使用Outlook Express ,可以打开“查看”菜单点击“语言”选项中的“简体中文(GB2312) ”项,或者点击工具栏上“语言”后面的向下箭头,选择“简体中文(GB2312)”功能项,屏幕出现一个对话框,单击“是”按钮,所有邮件主题中含有指定字符集的邮件应用新的字符集。如果你使用 Eudora 之类的软件,可以使用“南极星”之类的软件,自动转换不同的汉字编码。如果还看不到的话,可将这些编码文本,拷贝到一个文本编辑器中查看。

    (二)“半个汉字”乱码

    汉字的另一个问题是所谓的“半个汉字”乱码。如果看到下面这串乱码,你一定看不懂它的意思:
    “把砑⒂萌砑⒙蛉砑暮冒槁隆薄* ”

    由于很多英文编辑软件以字符为单位来处理文本,汉字被删除一半后, 剩余的部分会和相邻的汉字重新组合,使得文本面目全非。因此,除了在输入、删除的时候注意这种问题外,还要注意不要在英文字处理软件中轻易使用“ 字符替换”功能,这往往会把一个汉字的后一个字符和相邻汉字的前一个字符当成一个汉字被替换掉。

    对于“半个汉字”乱码,只要将“乱码”邮件存成一个文本文件,然后使用以字符为单位的编辑软件,将“乱码”行的首字符删除,后面的部分就会和相邻的“乱码”重新组合成可识别的汉字。

    如果上述方法不能奏效,那么只好告诉对方正确的发送方式,请对方重新发一份邮件给你了。

    六、相应编解码软件程序介绍。

    判断出乱码信件的编码方法后,再根据自己所拥有的软件种类,选取合适的解码软件。由于不同平台上不 同的软件程序使用方法差别很大,作者无法在此一一说明 ,各位读者可自己参照程序附带的 Help 、 Readme 等文件的说明,自行对乱码邮件进行解码。这里介绍一些 DOS 和 Windows 下的编 / 解码程序以及大体优缺点,供各位使用时参考。

    讲了这么多,相信大家对 E-MAIL 的编码有了一定了解,对于一般的编码乱码也有了一定的判别能力了。但 E-MAIL 乱码不仅仅是由于编码不同所造成的,还可能有其它的原因,比如:

    1 、该邮件采用了其它少见的编码方法,如 Binhex 或 XXencode 编码等。只要乱码前面有“信头”信息(一般显示了该邮件所用的编码方式), 即可用 Xferp111或其它“智能型” Windows 程序将其解码。

    2 、是否在中文环境内。如果你所用的操作系统是英文环境,而你又没有外挂中文系统(如中文之星)或未切换为中文(如 RICHWIN 四通利方或南极星等)编码方,则你自然看不到中文,而只能看到乱码。注意,双字节字符有中文简 / 繁体的 GB和 BIG5 码及日文的 JIS、EUC 和朝鲜文的 KSC 码等,在 GB 码环境下看其他双字节字符时也只能看到乱码。这就需要使用一些转码工具如 Richwin ,南极星等进行转码。

    3 、邮件未经过编码造成第 8 位字节滤掉成为无法还原的死乱码文档。

    七、一点体验:

    笔者曾遇到过这样一个问题,本人曾用过的邮件软件 Internet Mail 一直都很正常,但后来装了中文 IE5.0 后,就发现很多信件都出现乱码,换用其他编码用Big5能正常显示,百思不得其解,后来查遍资料才知道在 Internet Mail 中在电子邮件表头中,有一个栏位是专门来说明目前信件内文之字元集的。Internet Mail 中文版将此栏位解释为:若是 BIG5 码(繁体中文编码)则将两个位元组合成一个中文字;若为ISO-8859-1 或其他拉丁语系字元集则一个位元组一个字元解释(而一般的英文邮件程式或中文化程式表头栏都为 ISO-8859-1 ) ,(之所以装 IE5.0 后出现乱码,可能是由于安装后改变了 Mail程式设置吧。)所以当发信者用一般的英文软体输中文信时,收信者用 Internet Mail 接收时就会产生乱码。

    根本解决的办法是用 UltraEdit 编辑 Windows 中 System 中 Mailnews.dll 文件,将其中的“charset”换为“bingset”就可以了。

    八、为了尽量避免出现乱码问题,下面给出几点建议 :

    (1)、利用“附件”功能发送文件。

    使用 Netscape 、 Eudora 或 Pegasus 等邮件系统附加这类非标准 ASCII 码格式的文件时,附加文件通常可以自动进行“ base64 ”方式编码(仅对附件部分进行编码)。在用“附件”方式发送邮件之前,无需进行编码; 如果编码的话,将会给解码带来很多麻烦,意即收件人必须再一次进行解码。一般来说收件人都可以成功解码这类“附加”文件,因此强烈建议你采用这种方法发送中文类邮件。

    (2)、如果无法以附件方式发送文件,则必须在正文中发送中文或二进制文件。 如果发 / 收件人之间远隔万里,如在中国和英国之间,则传送过程中, 第八位将可能被截掉。这时最好先在正文中用中文给收件人发一封测试信,并了解对方能否正确收到邮件正文。如果第八位 被截掉,则收件人将会看到一些乱码,而不是上述的 uub64 Qp 等格式,而且这种信件几乎不可恢复。这种情况的解决方案是,在Netscape 、 Eudora 或 Pegasus Mail 等你所使用的邮件系统中,选择其首选项或选项配置中的“ Quoted Printalbe ”或“ MIME encoding ”项。

    (3)、发送重要信息时先发测试信。

    发送重要信息时,为了确认是否无须编码即可发送正文,应该先发送测试信。而且还应确定收件人能否对附件文件进行解码。如果发送已经编码的邮件,则最好添加足够的“信头”信息,以便收件人知道所需的解码方法 。比如可以把 uuencode /UUDeview 编码方式用 uuencoding 作信头。

    这些都要靠大家多实践摸索来积累经验加以解决!相信大家都将不再害怕E-mail乱码!

没有评论: