[轉載] 談 Internet E-mail 的編碼與解碼



贊助商連結


塵緣
2001-11-15, 03:36 PM
解讀天書 -- 談 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 [email protected] Mon Sep 2 01:10:20 1996
Return-Path: <[email protected]>
X-Sender: [email protected] (Unverified)
Date: Mon, 02 Sep 1996 01:08:36 +0800
To: [email protected]
From: Maggie Liang <[email protected]>
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=B
F=B3=A6=B3=BE=F7=
=B7|=A6b=A6=B9=A6V=A4j=AEa=A6=DB=A7=DA=A4=B6=B2=D0=A1A=A7=C
6=
B1=E6=A6=B3=BDt=BBP=B1z=B0=B5=AAB=A4=CD=A1C

這就是我們前面的例子中,「myself」這個檔案經過QP編碼後的模樣,您是
否真覺得它像是「天書」呢?我們可以再看看「myself」經過Base64之後又是
什麼德性呢?

pGquYaZuoUmn2qxPseepc6dnoUGr3LCqv7Oms773t3ymYqa5plakaq5hptu
n2qS2stChQafG
DQqx5qazvXS7ULF6sLWqQqTNoUM=

上段文字便是我們的「myself」經過Base64後的結果。收信方如何去判定要以
QP或是Base64去解碼呢?我們可以看一下這封mail範例:

>From [email protected] Mon Sep 2 11:57:11 1996
Return-Path: <[email protected]>
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: <[email protected]>
X-Sender: [email protected]
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: [email protected]
From: Maggie Liang <[email protected]>
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\=A
F=E0=A1A=A8=C3=AA=
=FE=B1H=A4@=AD=D3binary=C0=C9=AE=D7
mimeqp.exe=A1C

--=====================_841607721==_
Content-Type: application/octet-stream; name="Mimeqp.exe"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="Mimeqp.exe"

TVoQABYAAQAgAAAA//95AoAAAAAAAAAAIgAAAAEA+yByagEAAAAAAAAA
AAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAA
(因編碼後文件太長,以下之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軟體來收
取這份祝福,那怎麼辦呢?相信閱讀本文後,必定不再讓您感到遺憾,任何的
祝福您都不會錯過。

贊助商連結


KuoJL
2001-11-16, 11:23 AM
不錯的資訊..謝謝啦

tomshan
2001-11-16, 05:31 PM
oh......
終於看完了.......
不過終於了解為何會接到一些奇怪的信了
謝謝啦.....

theflow
2001-11-23, 01:50 AM
真是有夠水準的...
早一點看到不知有多好,之前拆碼拆的快死掉了

soon
2001-11-23, 08:23 AM
想不到....
光一個mail編碼就有這ㄇ大ㄉ學問!
真是佩服!!
:D 感謝你又讓我們又多一層ㄉ認識