Linux 版 (精华区)

发信人: don (回去睡觉了), 信区: Linux
标  题: 解读天书 -- 谈 Internet E-mail 的编码与解码
发信站: 哈工大紫丁香 (2000年09月30日10:34:23 星期六), 站内信件



解读天书 -- 谈 Internet E-mail 的编码与解码

(原文刊载於网际空间杂志85年10月号)




------------------------------------------------------------------------
--------


■前言 

 有人说,Internet是个无远弗届的世界,尤其是E-mail的传递,可让您的讯息迅
速地传送到收件人手中,大量减少了一般邮件所必须花费的费用及时间。的确,
E-mail的使用几乎是所有网路人的必要项目,在E-mail的使用上,更早已跨越了只
能传送文字的限制,不但可以传送8bits的中文字,还可用attach档案的方式传送
一些非文字的档案,它的使用可说是日益普及。但许多人仍会疑惑,非文字的「档
案」怎麽传送?又为什麽常常会有人收到一堆乱七八糟的「乱码」呢?本文撰写的
方式,将尽量以浅显易懂的叙述,说明这些mail如何的传送、如何的顺利解读,让
您不再「望天书而兴叹」!本文并将着重於「如何解码」,对於编码的原理及方式
则不多赘述,因为对於一般使用者而言,原理并不重要,能够顺利读到亲朋好友的
来信才是最重要的吧! 

■为什麽要编码 

 在Internet里,E-mail的传送是只能传送US-ASCII格式的文字讯息,ASCII是7位
元码,而非ASCII格式的档案,在传送过程中若不先经过编码,先编成7位元码再传
送,则在传送过程中会因为这7位元的限制而遭到拆解,拆解之後只会让收信方看
到一堆乱七八糟不知所云的东西。经过编码後的资料,在传送过程中可顺利传送,
不会有「被截掉一个bit」的危险,但是收信方必须具有解码的程式,将这份经过
编码的东西还原,才能解读「天书」,看到寄信人要传送的讯息是什麽。 

 尤其有一点要注意的是,大部份的人普遍会有「文字档不需要编码」的观念,但
我们的中文是属於8位元的文字,它并不是标准的ASCII格式,由於在台湾中文是通
行的文字,所以台湾的mail server都已能够处理BIG-5中文码,因而的确是不需要
做这种编码、解码的动作,可以直接传送。但如果要送中文信到国外,还是需要经
过这种手续才能传送,因为外国的mail server是无法辨认中文码的。中文码在经
过一些未支援中文码的传递主机时,依然会被截掉一个bit,造成支离破碎无法读
取的惨剧。而经过编码的中文信,收信人收到後,将档案解码还原,也是需要有中
文系统才能看您写的中文信。笔者常与几位赴海外留学的同学们通信,未免得英文
能力表达能力不佳,也是习惯用中文来写mail,只是他们必须在自己的PC上先安装
上中文windows,才能顺利使用中文来沟通哩!在此也顺便提醒读者们,若准备出
国留学,建议您带着一套中文系统出去,国外可不容易买到中文软体唷! 

■UU编码(uuencode与uudecode) 

 uuencode原来是unix上用的一种编码程式,後来有人改写成为在DOS亦可执行的
程式,而在图形介面的windows系统逐渐成为主流之时,自然这种功能也被运用在
windows软体上。在早期要传送非US-ASCII型式的资料,最常用的便是这种UU编码
(Unix-to-Unix encoding)方式。执行的方法,在DOS之下是先使用一种
uuencode.exe的程式将档案编成7位元ASCII档案,把它寄出,收信人收到後,可以
用uudecode.exe的程式将这份资料还原为原来的档案。而windows的程式则通常是
用一个软体便可执行uuencode 及uudecode的功能了。 

 笔者在此对於UU编码的示范说明,便是以DOS之下的uuencode、uudecode程式以
及在windows之下的wincode软体来做一范例。以上这些程式均属於shareware,可
在各大Ftp Server找到,读者朋友可使用网路上的archie功能来寻找及取得,至於
取得的方法,本文中不再多作介绍。 

 自ftp server取得uuencode及uudecode二支DOS程式後,我们可试着将要传送的
档案做一编码。假设我们有这样子的一段话,以中文Big5码写成的: 

「大家好!我是梁孟君,很高兴有机会在此向大家自我介绍,希望有缘与您做朋友
。」 

这一段文字您可能是使用某些文字编辑软体写成,例如以PE2打完这段文字後,以
「myself」为档名存档。uuencode及uudecode的使用方式如下: 

uuencode file_1 file_2 ==>file_1为原始档案之档名
             file_2为编码後之档名(可自取一个档名) 

如果您不预设这个file_2档名,它内定会产生一个名为file_1.uue的档案,接着可
将file_2寄出(编好後的file_2看起来是一堆乱码)。 

收信方收到後存档,档名取为file_3,再使用uudecode.exe解码:uudecode 
file_3,这时会产生一个和原先一模一样的file_1 

我们以上例的「myself」来看编码的结果: 

uuencode myself,按下enter键後,我们可以看到在磁碟里多出了一个myself.
uue的档案,用文书软体叫出这个myself.uue後,内容如下: 

section 1 of uuencode 5.21 of file myself  by R.E.M. 

begin 644 myself
MI&JN8:9NH4FGVJQ/L>>I<Z=GH4&KW+"JO[.FL[[WMWRF8J:YIE:D:JYAIMN
G=VJ2VLM"A0:?&#0JQYJ:SO72[4+%ZL+6J0J3-H4/-4
`
end
sum -r/size 32014/129 section (from "begin" to "end")
sum -r/size 43769/74 entire input file


 其中第一行的「section 1 of uuencode 5.21 of file myself  by R.E.M.」
以及最後二行「sum -r/size 32014/129 section (from "begin" to "end")」「
sum -r/size 43769/74 entire input file」只是这个软体的设计者的加注说明,
不是很重要,最重要的是在「begin 644 myself」与「end」之间的文字,那就是
我们原文编码後所呈现的模样。您可以把它copy到您的E-mail软体中,加上收信人
的E-mail address就可以把它寄出了。要注意的是您必须让这一行「begin 644 
myself」与「end」以及它们之间所有的文字都完整的出现在您的mail中,对方使
用uudecode时才能根据其「begin」、「end」自动抓取内文而还原第一行「
begin 644」之後的档名,也就是我们原来的那个档案。 

 假设我是收信人,我收到的mail内文如下: 

>From maggie@iii.org.tw Mon Sep 2 01:10:20 1996
Return-Path: <maggie@iii.org.tw>
X-Sender: maggie@iiidns.iii.org.tw (Unverified)
Date: Mon, 02 Sep 1996 01:08:36 +0800
To: maggie@iii.org.tw
From: Maggie Liang <maggie@iii.org.tw>
Subject: test uuencode

This is a test mail, it's encoded by uuencode.exe.
Please use uudecode.exe to decode it.

begin 644 myself
MI&JN8:9NH4FGVJQ/L>>I<Z=GH4&KW+"JO[.FL[[WMWRF8J:YIE:D:JYAIMN
G=VJ2VLM"A0:?&#0JQYJ:SO72[4+%ZL+6J0J3-H4/-
`
end


 我只要将这个mail存档,例如我可以将之存成test.txt,然後以uudecode 
test.txt的指令去还原,我就可以看到原来那篇文字「大家好!我是梁孟君,很高
兴有机会在此向大家自我介绍,希望有缘与您做朋友。」 

 上述是以DOS之下的程式去做这个动作,事实上有许多windows的软体也有这种功
能,下面将介绍wincode的使用。既然都是执行uuencode、uudecode,原理上和
DOS程式没什麽两样,只是在windows的介面下,操作是更为简便。wincode这套软
体除支援UU编码之外,也支援MIME、BINHEX等编码格式,应用范围颇为广泛,因而
笔者在此推荐给读者朋友们。wincode在一般ftp server的档名是wncod266.zip,
其「266」指的是版本别,您可能找到的是wncod260.zip或是其它版本,截至笔者
完稿之时,所看到最新的版本是266,但即使您寻找到的是较旧的版本,其功能上
的差异不大,各位读者仍可使用它来操作本文所介绍的功能。 

 wincode在解压缩并安装完成後,我们可以执行其主程式,在进入主画面之後,
可先点选功能表中的「Options」,设定您需要的项目。在此例中,我们要执行
uuencode及uudecode,可在「Options」中的「Configuration」设定encode及
decode的code type,选择UUE,即是采行UU编码。 

  主功能表中的「File」选项,则让您选择是要encode还是要decode。选择
encode後,它会寻问您Input file,并出现树状目录让您选择。点选之後,则出现
一行「Enter a VALID DOS filename」,请您输入encode後要将档案存成何种档名
,其内定值即是将您的原来档名加上UUE的副档名。而进行decode时,也只要在「
File」中选择decode,即出现树状目录让您选择您要decode的档案,点选之後同样
出现「Enter a VALID DOS filename」,请您输入要存档的档名。一般会根据其原
文中第一行「begin 644 filename」中的filename做为预设值,您也可以更改它,
另存新档。uuencode在编码时,会在这第一行自动记录原来未编码时的档名。 

 有些mail软体内附有decode的功能,在收到这种uuencode编码的mail,可直接在
mail软体中解码,例如Winspan的mailer。您可以在收到mail後,在「收信邮箱」
中点选您要decode的那封mail,然後选择功能表的「讯息」,点选「UUDECODE」,
即可decode这个档案。 

 以上介绍的UU编码,并非只能编中文文字,任何您要寄送的档案,例如exe档,
都可以先编码再寄送,收信方解码还原即可得到您寄给他的档案。 

■MIME(Multipurpose Internet Mail Extentions) 

 UU编码解决了mail只能传送ASCII档案的问题,但这种方式其实并不是很方便,
而後又发展出一种称之为MIME的编码规格,其全名是Multipurpose Internet Mail
 Extentions,一般翻译成「多媒体传送模式」。顾名思义,它标榜的就是可以传
送多媒体型式的档案,可以在一封mail中附加各种型式档案一起送出。 

 在MIME的规格订定出来後,MIME已成为Internet E-mail的主流,它的好处是以
物件包装方式,可将多种不同档案一起打包再传送,送信人只要将档案选好,它在
传送时即时编码,收信人的软体收到也是即时解码还原,完全自动化,是非常方便
的一种传送方式。当然先决条件是双方的软体都必须具有这种功能,要不然送信人
很方便的把信送出去了,但收信人的软体如果没有这种功能,无法把它还原,他看
到的也就是一大堆乱码了!使用这种方式,user根本不需要知道它是如何编码、解
码的,如果只是用文字写写信,一样是打好字便寄出,如果是要寄档案,只要做选
档案的动作,选完寄出,其馀的工作您的mail软体会帮您做。由於MIME的方便,愈
来愈多mail软体采用这种方式,例如Acacia Mail、Eudora、Microsoft Exchange
等等。 

  虽说在使用MIME这种编码规格时,user是可以不用知道如何编码,只要具有这
种支援MIME的E-mail软体即可收发自如,但本文仍对於它的编码方式略作说明,以
防万一您的E-mail软体并不支援MIME,您在收到这种「天书」时,还能够有办法解
读天书。 

  MIME定义的是一种规格,也可以说是一种统称,其实能够符合这种规格的编码
方式并不是单一的一种,只要符合这种MIME规格便可顺传送。以货运作为比喻,若
货运公司规定送交货运的规格是一公尺见方的箱子便可托运,您只要使用一公尺见
方的货运箱,它并没有限制一定要用木板钉成的箱子或是铁皮箱,只要是一公尺见
方,货运公司就帮您送达。而至於箱子里您是要装食品或是书本或是衣服或是混合
着装也没有限定,也就是说内容可以多种型态的档案一起寄送。 

 就上例而言,「一公尺见方」是货运规格,也就是我们的MIME规格;木箱或铁皮
箱是编码方式,现在我们就来看看您有哪些箱子种类可以选择!MIME 定义两种编
码方法:Base64 与QP(Quote-Printable),两者使用时机不同,QP的规则是对於资
料中的7bits无须重复encode,仅8bits资料转成7bits。QP编码适用於非US-ASCII
的文字内容,例如我们的中文档案,而Base64的编码规则,是将整个档案重新编码
,编成7bits,它是用於传送binary档案时使用。由於编码的方式不同,会影响编
码之後的档案大小。一般在具有MIME 功能的E-mail软体中会自动判别您的mail内
容,自动选择是要使用QP或是Base64,有些较懒惰的软体便都一律采用Base64编码
了。 

 QP编码的方式,是将一个字元用二个16进位法的数值表示,然後前面再加个「=
」字元(等号),所以我们看到经过QP编码後的文字是这个样子: 

=A4j=AEa=A6n=A1I=A7=DA=ACO=B1=E7=A9s=A7g=A1A=AB=DC=B0=AA=BF=B3=A6=B3=BE=
F7=
=B7|=A6b=A6=B9=A6V=A4j=AEa=A6=DB=A7=DA=A4=B6=B2=D0=A1A=A7=C6=B1=E6=A6=B3
=BDt=
BBP=B1z=B0=B5=AAB=A4=CD=A1C 

这就是我们前面的例子中,「myself」这个档案经过QP编码後的模样,您是否真觉
得它像是「天书」呢?我们可以再看看「myself」经过Base64之後又是什麽德性呢
? 

pGquYaZuoUmn2qxPseepc6dnoUGr3LCqv7Oms773t3ymYqa5plakaq5hptun2qS2stChQafG
DQ
qx5qazvXS7ULF6sLWqQqTNoUM= 

上段文字便是我们的「myself」经过Base64後的结果。收信方如何去判定要以 QP
或是Base64去解码呢?我们可以看一下这封mail范例: 

>From maggie@iii.org.tw Mon Sep 2 11:57:11 1996
Return-Path: <maggie@iii.org.tw>
Received: from maggie.seed.net.tw ([139.175.49.16]) by iii.org.tw (4.
1/SMI-4.1)     id AA29902; Mon, 2 Sep 96 11:57:03 CST
Message-Id: <1.5.4.32.19960902035521.0066bafc@iiidns.iii.org.tw>
X-Sender: maggie@iiidns.iii.org.tw
X-Mailer: Windows Eudora Light Version 1.5.4 (32)
Mime-Version: 1.0
Content-Type: multipart/mixed; 
boundary="=====================_841608510==_"
Date: Mon, 02 Sep 1996 12:08:30 +0800
To: maggie@iii.org.tw
From: Maggie Liang <maggie@iii.org.tw>
Subject: Test MIME mail!
X-Attachments: C:\code\mimeqp\Mimeqp.exe;
Status: R


--=====================_841608510==_
Content-Type: text/plain; charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

=B3o=A4@=AB=CAmail=A1A=ACO=ADn=B4=FA=B8=D5MIME=AA=BA=A5\=AF=E0=A1A=A8=C3
=AA=
=FE=B1H=A4@=AD=D3binary=C0=C9=AE=D7mimeqp.exe=A1C 
--=====================_841607721==_
Content-Type: application/octet-stream; name="Mimeqp.exe"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="Mimeqp.exe"

TVoQABYAAQAgAAAA//95AoAAAAAAAAAAIgAAAAEA+yByagEAAAAAAAAAAAAAAAAAAAAAAAAA
AAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAA
(因编码後文件太长,以下之base64码省略)

我们可以很清楚地看到,这一封送出去的mail中,其head中已很清楚地定义这是遵
循MIME ver1.0的规格,并且前面一段的文字定义「Content-Transfer-Encoding:
 quoted-printable」是用QP编码,後面附寄的binary档案,则在这几行中也交待
清楚:
Content-Type: application/octet-stream; name="Mimeqp.exe"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="Mimeqp.exe"
是要寄一个名为mimeqp.exe的档案,并且已经用Base64编过码了。


  其实这些讯息都是我的Eudora软体在送信时自动完成编码、加注、寄出等动作
,我只在信件中写下这些字「这一封mail,是要测试MIME的功能,并附寄一个
binary档案mimeqp.exe。」然後选择我的attach档案,Eudora在把信件送出时自动
转换变成了上面那些文字与符号,将这些讯息送到了mail server,经由mail 
server的传递送到了收信人的mail server。而收信人在收信时,如果他也用这种
支援MIME格式的软体来收信,那麽他的软体在读取mailserver送过来的讯息时,会
自动再翻译回来「这一封mail,是要测试MIME的功能,并附寄一个binary档案
mimeqp.exe。」而且把这个附寄的mimeqp.exe档案存在他的硬碟里,他收到的是一
段完整的文字,以及一个完整的档案,而不是有如天书般的乱码。 

  如果很不幸地,收信人没有这种支援MIME的软体,他看到的东西就是我们上面
那些一大段的符号了。另外,上封mail笔者是为了测试QP编码,所以在文字部份也
指定编码,因而形成「=B3o=A4@=AB=CAmail=A1A」这样子的符号,但如同本文一开
始所述,事实上在台湾的mail server都能够处理中文码,中文码可以不用编码就
寄出。如果把QP编码的功能取消,亦即文字部份不先编码而直接寄出,则这位没有
MIME软体的收信人是可以看到完整的原文的。 

  这位不幸地收信人如果恰好是您,别急,您仍然可以先将这份天书存档,然後
使用一些decode软体把它翻译回来的。但目前笔者尚未找到可以同时处理QP与
Base64的解码软体,若您收到含有QP码又有Base64码的mail,可能只得分二次处理
了。 

  在Base64码的部份,您可以使用前文所介绍之wincode软体来执行decode工作
,只要将decode type设为Base64即可,方式如同UU码。可惜的是wincode并没有支
援QP码。 

  笔者在此另外再介绍一个於DOS下执行的程式:base64.zip。读者们可用
archie寻找ftp server中是否有这个程式。这个压缩档解压缩後会产生encode64.
exe与decode64.exe二个档以及其说明档base64.doc。使用方法非常简单,举例而
言,若要将一个名为test.com的档案编码,只要以下列指令: 

encode64 test.com 

按下enter之後,它会自动产生test.64这个档案,其内容便是test.com的base64编
码。如欲解码,亦只要以下列指令: 

decode64 test.64 

便可以把该档案还原。因此倘若您没有可支援MIME的mail软体,您只要将收到的
mail先存档,例如存成一个名为「myfile」的档案,然後去执行decode功能,不论
您用的是wincode或是decode64,它会依据这一行的记录,把档案还原回来的档名
(在"name="之後的档名)。 

Content-Type: application/octet-stream; name="test.com" 

  至於QP编码,笔者尚未找到适合的windows软体,因而在此介绍的是二支DOS程
式:cvnt_qp与mimeqp。同样地,我们可以在ftp server找到这二支程式,其档名
分别是cnvt_qp.zip与mimeqp.zip。其使用方法与前面所介绍的base64差不多。 

  cnvt_qp在解压缩之後,会产生cnvt_qp.exe,除了一个说明档qp.doc外,作者
尚附上其C语言写成的原始程式码,cnvt_qp.c,有兴趣的读者可自行参考这支程式
的设计。使用上,执行cnvt_qp.exe後,会出现一简单的功能表,让您选择是要将
8bits文字档encode成QP码,或是将QP码decode成一般文字档。选择您需要的项目
後,只要再输入您要encode或decode的档名即可。 

  mimeqp的使用也相当简便,其指令如下,亦可以mimeqp -? 来看其说明: 

  mimeqp -e filename ? 将档案编码(encode)
  mimeqp -d filename ? 将档案解码(decode) 

■ Binhex编码 

  Binhex的编码方式较常用於Mac机器,在PC上是较少使用的一种编码方式。一
般PC上的mail软体,亦多数支援MIME的规格,少有支援Binhex格式。在笔者常用的
mail软体中,唯Eudora具有这种功能,可直接解读Binhex之编码。如果您收到了这
种由Binhex所编码的mail,而且您的mail软体并不是Eudora 或其他有支援Binhex
格式的软体,那怎麽办呢?别急,我们这儿也介绍一个解读Binhex的程式给您! 


  这也是一个shareware,您可以在一些ftp server找到的,档名是binhex13.
exe,它是一个在DOS之下执行的程式。同样地,先把您收到的「天书」存档,然後
在DOS下执行这个binhex13.exe。执行後它会出现一个简易视窗,萤幕最下方则是
功能表。我们可以看到其F1是help、F2是「Bin2Hex」,也就是把binary档案转换
成Binhex码;而F3是「Hex2Bin」,也就是把Binhex码还原成binary档案。因此您
可以按下键盘上的功能键F3,然後它会出现一个小对话视窗,让您选择您要解码的
档案,这时选取刚刚您把mail存下来的档案,按下enter键,您会看到萤幕上出现
「filename successfulely converted」,它已经帮您把档案解码还原啦! 

  在windows之下,您还可以用我们前面所介绍的wincode来解码,看到这儿,您
是不是要赞叹wincode的功能真是强大,本文介绍的UU编码、MIME、Binhex居然都
可以用它来处理!是的,它是一个不错的编码、解码软体,可处理多种格式之编码
方式。稍微可惜的是对於MIME,它只处理base64之编码,如果能再加上QP的功能,
您真的可以靠它走遍天下了! 

■ 结语 

  经由本文的介绍说明,相信各位读者已对於各种编码方式具相当的了解,您是
否觉得它其实一点也不困难呢?虽然好像有点复杂,但其实在MIME几乎已成标准规
格的现在,用一套支援MIME的软体来做收发E-mail的工作,这些编码、解码是不劳
您去伤脑筋的。不要觉得很麻烦,想想看如果您有位远方的朋友过生日,您亲自用
绘图软体画了一张精美贺卡,还用音效程式录下您美妙的歌声唱着生日快乐歌,然
後用E-mail在一瞬间传送到他那儿,是多麽温馨感人呀!如果您正是那位令人 慕
的寿星,偏偏您又没有适当的mail软体来收取这份祝福,那怎麽办呢?相信阅读本
文後,必定不再让您感到遗憾,任何的祝福您都不会错过。 




------------------------------------------------------------------------
--------



RS电脑资料站: http://rygshen.yeah.net   E-mail: rygshen@nease.net 
--
一条驿路,一种氛围。
一朵梨花,一种思考。
希望能在Linux这条驿路上与你同行!

※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: PR-AI.hit.edu.cn]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:208.300毫秒