|
電子函件是Internet上最古老的服務(wù),但直到今天,它仍然充滿活力,許多新的服務(wù)如ftpmail、MailingList、新聞組等也都是從電子函件發(fā)展而來的。但對于中文用戶來說,亂碼問題可能困擾著許多用戶。我平均每天要收幾十封信,幾乎每天都要遇到這種問題。如果你也有類似的遭遇,不妨照我說的試試。 亂碼由何而來呢?這要從Internet的歷史談起,Internet上的函件協(xié)議是1982年定義的,那時的函件主要由英語文本組成,因而函件協(xié)議只支持簡單的ASCII文本也就不足為奇了。隨著Internet的廣泛應(yīng)用,傳遞的數(shù)據(jù)也已經(jīng)不局限于簡單的英語文本,這就需要有一種辦法允許在函件消息中傳遞二進制數(shù)據(jù),而又不違背當(dāng)初的協(xié)議標(biāo)準(zhǔn)。把二進制數(shù)據(jù)轉(zhuǎn)換為文本數(shù)據(jù)叫編碼(encode),反之稱為解碼(decode)。目前編碼的標(biāo)準(zhǔn)有很多,如UU、MIME等等。如果收發(fā)雙方都使用同一種編碼/解碼方法,那不會有任何問題出現(xiàn),但如果發(fā)送方采用一種方法,而接受方不能識別這種方法,就會出現(xiàn)亂碼。如果是一個單位內(nèi)部的函件系統(tǒng),可以規(guī)定所有人使用同一種編碼/解碼方式,可在Internet上情況就復(fù)雜多了。你可能會收到素不相識的人的來信,他(她)可能使用很特殊的函件軟件或操作系統(tǒng)。有的函件在傳輸過程中還會被進行特別的處理,也可能會對數(shù)據(jù)進行編碼。所以除非你只與自己的好朋友通信(這樣的話,Internet又有什么意義呢?),你早晚會遭遇到這個問題。 怎么解決亂碼問題呢? 首先是設(shè)置好你的函件軟件。許多函件軟件允許你選擇函件的編碼/解碼方式,最好選擇MIME(MultipurposeInternetMailExtension),這是目前使用最廣返的協(xié)議。如果你的函件程序不支持這種協(xié)議,你應(yīng)該考慮換一個軟件了。 不過,MIME包括不只一種編碼/解碼方案,其1.0版包括五種標(biāo)準(zhǔn)編碼方式,在實際使用中還出現(xiàn)了一些廠商定義的方案。目前使用最多的是base64編碼,它將每3個8位的字節(jié)轉(zhuǎn)換為4個用ASCII碼表示的6位字節(jié),這種方法會使文件長度增加三分之一。下面就是用base64編碼的ZIP文件(片段): Content-Type:application/x-zip-compressed;name="ACTIVEX.ZIP" Content-Transfer-Encoding:base64 Content-Disposition:inline;filename="ACTIVEX.ZIP" UEsDBBQAAgAIAGt/5yIVq5UiVBMAAAA4AAALAAAAQUNUSVZFWC5ET0PtO2twXNV5ZyUZ/EDYgAHHTajCGCpNQDWEuCmExsY2wY2NwXhwZkrasbGondoSY8shSacdZkr5kclM6UwnQ2eatHevMfJqbe+u7tU+7j6119rVvdrdq93VXVnIIEt+PwSWwULWw/2+c/Z6H1rZMmUykPpqPp37+M45 另外一種使用得比較多的是quoted-printable,象Lotus的cc:mail就使用這種方式。這種編碼是把8位的字符轉(zhuǎn)換成一個等號加上兩個該字符的16進制值。這種方法非常簡單,特別適合那些數(shù)據(jù)大多數(shù)是7位ASCII文本,偶爾插入8位字母的情況,但對漢字編碼效果不夠好,因為每個雙字節(jié)漢字經(jīng)過編碼后會變成6個字節(jié)。下面這段是我從CERNet的InternetinChina討論組(iic-l@iic.edu.cn)收到的一封函件的片段,它采用的就是quoted-printable編碼: Date:Thu,31Jul199707:34:12-0800(GMT) From:aaoaaaoa@pub.nj-online.nj.js.cn To:iic-l@iic.edu.cn Subject:ContributionaboutChineseStockMarket Message-ID:<199707311534.HAA10434@pub.nj-online.nj.js.cn> =A1=A1=A1=A1=A1=A1=A1=A1=A1=A1=A1= =A1=BC=C6=BB=AE=CF=C2=B5=C4=D6=D0=B9=FA=B9=C9=CA=D0 =CF =A1=A1=A1=A1=C6=DF=D2=BB=CF=E3=B8=DB=BB=D8=B9=E9=A3=AC=BE=D9=B9=FA=BB=B6=C7= =EC=A1=A3=C8=BB=B6=F8=A3=AC=B1=BE=D3=A6=BD=E8=B4=CB=B6=AB=B7=E7=B8=FC=C9=CF= =D2=BB=B2=E3=C2=A5=B5=C4=BB=A6=C9=EE=B9=C9=CA=D0=C8=B4=D2=D4=C1=AC=D0=F8=B2= 在實際使用中,這種編碼還有一種變形,即用“%”號代替“=”號。例如,我的主頁有一個“問題與解答”專欄,訪問者可以在主頁上輸入問題,該問題就會被發(fā)送到我的郵箱里,下面就是一個問題的片段: name=+%B0%A2%D6%BE&email=tjjnet@netchina.co.cn&comment=+1%A1%A2%D4%DAWIN 由此可見,如果你的函件程序不能支持所有的MIME編碼方式,那么即使雙方都使用MIME協(xié)議,仍有可能出現(xiàn)亂碼。 去除亂碼的另一個方法就是選擇一種能支持多種編碼/解碼的軟件。這樣的軟件有不少,但筆者最偏愛的是ESSCode,你可以在www.hotfiles.com找到它。它支持UU、MIME、SHIP、BTOA等多種方案。如果你需要將二進制文件轉(zhuǎn)換為文本文件,可以使用菜單上的UUEncode、MIME-Encode、SHIP-Encode和BTOA-Encode;反之,使用UUDecode、MIME-Decode、SHIP-Decode和BTOA-Decode。ftpmail(使用函件來執(zhí)行ftp命令)的服務(wù)器可能會把大文件分成幾個小部分發(fā)送給你,而ESSCode支持文件的合并與分解,這樣使用起來就很方便了。 僅有這兩方面的工作還是不夠的,因為ESSCode和函件程序都是根據(jù)一定的標(biāo)志來識別編碼方式,但有的函件(如上面提到的InternetinChina函件)沒有相應(yīng)的標(biāo)志,這樣的文件ESSCode不能處理。對于此類文件你需要加上一個標(biāo)志頭。MIME的標(biāo)志頭中影響編碼的有三行:第一行是Content-Type,它表明文件的類型,象前面的application/x-zip-compressed表明是一個ZIP壓縮文件,text/plain表示普通文本文件;第二行Content-Transfer-Encoding表示編碼方式;第三行Content-Disposition表示編碼文件的位置。為了解碼InternetinChina函件,我們可以先在函件前面加上三行: Content-Type:text/plain;name="iic-l51.txt" Content-Transfer-Encoding:quoted-printable Content-Disposition:inline;filename="iic-l51.txt" 這樣處理后,ESSCode就可以正確解碼了。這里的iic-l51.txt是我自己起的名字,ESSCode會自動以此名保存解碼后的文件。 如果你嫌每次都這樣加上標(biāo)志太麻煩,也可以從我的主頁http://www./~zealsoft上下載ZealDecoderV1.0,這個程序不需要標(biāo)志頭就可以解碼,但它只處理quoted-printable編碼的文件。如命令 zdecodeiic-l51iic-l51.txt 可以將iic-l51文件解碼為iic-l51.txt。如果使用的引導(dǎo)字符不是“=”,而是“%”,可以使用下面的命令 zdecodeiic-l51iic-l51.txt% 但愿我的這些雕蟲小技對你暢游Internet有所幫助。 |
|
|
來自: 情踏天涯 > 《電腦/上網(wǎng)》