全面解析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-unixencoding)

  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(MultipurposeInternetMailExtention)标准的编码

  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,其格式为:

  begin644gx.zipMig)0;....

  ...

  end

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

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

  具体方法有:

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

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

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

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

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

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

  (一)、Base64encode编码判断

  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,由OutLookExpress打开,就可以自动解码。

  (二)、QP编码判断

  QP编码大体格式如下:

  =A1A=B1Z=A6N=A1I=AT=DA

  ....

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

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

  (2)、使用Winzip对Quoted-Printable解码。必须注意:

  (a)在邮件信头中检查、添加这样两行:Mime-Version:1.0Content-Transfer-Encoding:quoted-printable;

  (b)信头中间不要空行,信头和信体之间要有一个空行。这样形成的文件,改后缀名为UUE,即可双击启动Winzip得到解码。

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

  (一)HZ中文乱码

  由于网友们可能使用不同的电子邮件收发软件,因此,来自各个网友的邮件内容可能包含着看不懂的乱码,例如,如果看到下面这串乱码,囊馑迹篐Z-实际上这是一串"简体中文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能正常显示,百思不得其解,后来查遍资料才知道在InternetMail中在电子邮件表头中,有一个栏位是专门来说明目前信件内文之字元集的。Internet Mail中文版将此栏位解释为:若是BIG5码(繁体中文编码)则将两个位元组合成一个中文字;若为ISO-8859-1或其他拉丁语系字元集则一个位元组一个字元解释(而一般的英文邮件程式或中文化程式表头栏都为ISO-8859-1),(之所以装IE5.0后出现乱码,可能是由于安装后改变了Mail程式设置吧。)所以当发信者用一般的英文软体输中文信时,收信者用InternetMail接收时就会产生乱码。

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

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

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

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

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

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

  发送重要信息时,为了确认是否无须编码即可发送正文,应该先发送测试信。而且还应确定收件人能否对附件文件进行解码。如果发送已经编码的邮件,则最好添加足够的"信头"信息,以便收件人知道所需的解码方法。比如可以把uuencode/UUDeview编码方式用uuencoding作信头。这些都要靠大家多实践摸索来积累经验加以解决!相信大家都将不再害怕E-mail乱码!



附MIME类型表

序号

内容类型

文件扩展名

描述

1

application/msword

doc

Microsoft Word

2

application/octet-stream bin

dms lha lzh exe class

可执行程序

3

application/pdf

pdf

Adobe Acrobat

4

application/postscript

ai eps ps

PostScript

5

appication/powerpoint

ppt

Microsoft Powerpoint

6

appication/rtf

rtf

rtf格式

7

appication/x-compress

z

unix压缩文件

8

application/x-gzip

gz

gzip

9

application/x-gtar

gtar

tar文档(gnu格式)

10

application/x-shockwave-flash

swf

MacroMedia Flash

11

application/x-tar

tar

tar(4.3BSD)

12

application/zip

zip

winzip

13

audio/basic

au snd

sun/next 声音文件

14

audio/mpeg

mpeg mp2

Mpeg声音文件

15

audio/x-aiff

mid midi rmf

Midi格式

16

audio/x-pn-realaudio

ram ra

Real Audio声音

17

audio/x-pn-realaudio-plugin

rpm

Real Audio插件

18

audio/x-wav

wav

Microsoft Windows声音

19

image/cgm

cgm

计算机图形元文件

20

image/gif

gif

COMPUSERVE GIF图像

21

image/jpeg

jpeg jpg jpe

JPEG图像

22

image/png

png

PNG图像

23

image/tiff

tiff tif

TIFF图像

24

image/x-pict

pic

MACINTOSH PICT图像

25

text/css

css

CSS风格纸

26

text/html

html htm

HTML文档

27

text/javascript

js ls mocha

JAVASCRIPT脚本

28

text/plain

txt

ASCII文本

29

text/richtext

rtx

MICROSOFT RICH TEXT

30

text/tab-separated-values

tsv

TAB-SEPARATED VALUE

31

text/vbscript

vbx

VISUAL BASIC脚本

32

text/sgml

sgml sgm

SGML文本

33

video/mpeg

mpeg mpg mpe

MPEG影像

34

video/quicktime

qt mov

QUICKTIME视频

35

video/x-msvideo

avi

WINDOWS(AVI)视频

36

x-video/x-vrml

wrl vrml

Vrml

posted @ 2005-07-08 11:15  Ready!  阅读(1554)  评论(1编辑  收藏  举报