解讀天書 -- 談 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>>IFrom maggie@iii.org.tw Mon Sep 2 01:10:20 1996 Return-Path: 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 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>>IFrom maggie@iii.org.tw Mon Sep 2 11:57:11 1996 Return-Path: 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 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軟體來收 取這份祝福,那怎麼辦呢?相信閱讀本文後,必定不再讓您感到遺憾,任何的 祝福您都不會錯過。