电竞比分网-中国电竞赛事及体育赛事平台

分享

如何消除電子函件的亂碼

 情踏天涯 2013-01-06

  電子函件是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)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多