一、為什么要編碼?
在Internet里,E-mail的傳送是只能傳送US
-ASCII格式的文字訊息,ASCII是7位的,而非ASCII格式的檔案,在傳送過程中若不先經(jīng)過編碼,先編成7位再傳送,則在傳送過程中會因為這7
位元的限制而遭到拆解,拆解之后只會讓收信方看到一堆亂七八糟不知所云的東西。經(jīng)過編碼后的資料,在傳送過程中才可順利傳送,不會有“被截掉一個bit”
的危險,但是收信方必須具有解碼程序,將這份經(jīng)過編碼的東西還原,才能解讀“天書”,看到寄信人要傳送的真實信息。
二、MIME/BASE64編碼:
BASE64編碼是用的最多的郵件編碼格式,具體如下:
base64和quoted-printable都屬于mime(多部分( multi-part)、多媒體電子郵件和 www 超文本的一種編碼標準,用于傳送諸如圖形、聲音和傳真等非文本數(shù)據(jù))。mime定義在rfc1341中。base64是現(xiàn)今在互聯(lián)網(wǎng)上應(yīng)用最多的一種編碼,幾乎所有的電子郵件軟件頭把它作為默認的二進制編碼,它已經(jīng)成了現(xiàn)今電子郵件編碼的代名詞。
下面是base64的一個例子,從例子中,您也可以看到base64與電子郵件的的緊密聯(lián)系:
content-type: text/plain;charset="cn-gb"
content-transfer-encoding: base64
cqkjicagikg2wtlc68vjt6i088irobcncgnx99xfom1vz2fvo6yw19tgu8a619w+o6h0zwxuzxq6
ly8ymdiumteyljiwljezmjoym6ops8nusagjdqojicagicagxkq438jtvp65pnf3ytkjumh0dha6
ly9tb2dhby5izw50axvulm5lda0kcqkjrw1hawx0bzptb2dhb0aznzeubmv0dqojicagkioqkioq
kioqkioqkioqkioqkioqkioqkioqkioqkioqkioqkioqkioqkioqicagicagicagicagicagdqoj
icagkicz/chlvmfs5mqyw7s2vlk7tpjx36oss/3by9fjvkpksso0tryyu8h0z8iqdqojicagkioq
kioqkioqkioqkioqkioqkioqkioqkioqkioqkioqkioqkioqkioqkioq
base64的算法很簡單:它將字符流順序放入一個 24 位的緩沖區(qū),缺字符的地方補零。然后將緩沖區(qū)截斷成為 4 個部分,高位在先,每個部分 6
位(6位二進制數(shù)可表示0~63),用下面的64個字符重新表示(0就是a,1就是b…):
“abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz0123456789+/”。如果輸入只
有一個或兩個字節(jié),那么輸出將用等號“=”補足。這可以隔斷附加的信息造成編碼的混亂。它每行一般為76個字符。
三、其他編碼方式介紹:
1、QP編碼:
quoted-printable簡稱qp, 一般用在email系統(tǒng)中。它通常用于少量文本方式的8位字符的編碼,例如foxmail就用它做對主題和信體的編碼。這種編碼的應(yīng)該是很好辨認的:它有大量的“=”。下面是它的一個例子:
mime-version: 1.0
content-transfer-encoding: quoted-printable
=a1=b6=c2=d2=c2=eb=cb=e3=b7=a8=b4=f3=c8=ab=a1=b7
=d7=f7=d5=df:xxxx=a3=ac=b0=d7=d4=c6=bb=c6=ba=d7=d5=be=a3=a8telnet://61.129.63.131:23=a3=a9
=b3=c9=d4=b1=a1=a3
=c4=aa=b8=df=c8=ed=bc=fe=b9=a4=d7=f7=ca=d2=a3=bahttp://docs.xuehu.com
emailto:yin_jie@163.net
*********************************************
* =b3=fd=c1=cb=bc=c7=d2=e4=ca=b2=c3=b4=b6=bc=b2=bb=b4=f8=d7=df=a3=ac=b3=fd=c1=cb=d7=e3=bc=a3=ca
=b2=c3=b4=b6=bc=b2=bb=c1=f4=cf=c2*
*********************************************
qp的算法可以說是最簡單的也可以說是編碼效率最低的(它的編碼率是1:3),它是專門為了處理8位字符制定的。它的算法是:讀一個字符,如果ascii碼大于127,即字符的第8位是1的話,進行編碼,否則忽略(有時也對7位字符編碼)。
2. unicode
unicode應(yīng)用中最典型的例子是:ie4以上版本對html的編碼。它可以說是未來windows下唯一的字符集。但它還很不完善,而且win95和
win98對它的支持還很有限,甚至它還沒有一套完整的標準。不過,微軟最新推出的office2000和馬上就要推出的windows2000將全面支
持unicode。unicode取代其他編碼將會是必然的趨勢。不過,在近一兩年unicode并不會占主導地位,就是在占主導地位后,因為操作系統(tǒng)的
差異,其他編碼也不會立即消亡。它的中文資料可以在office2000和windows2000所帶的文檔中找到,它的官方網(wǎng)站是:http:
//www.unicode.org/。
3. binhex
binhex 編碼是 macintosh
計算機(也就是俗稱的“蘋果電腦”)上用可打印字符表示/傳輸二進制文件的一種編碼方法。它的主要用途是在電子郵件程序中attach二進制文件。大部分
的電子郵件程序不支持這種格式(eudora支持),但用winzip可以進行解碼。它的資料請查閱macintosh計算機帶的相關(guān)文檔。
4.uuencode
uuencode 是將二進制文件以文本文件方式進行編碼表示、以利于基于文本傳輸環(huán)境中進行二進制文件的傳輸/交換的編碼方法之一, 在郵件系統(tǒng)/二進制新聞組中使用頻率比較高,經(jīng)常用于 attach 二進制文件。
這種編碼的特征是:每一行開頭用“m”標志
uuencode的算法很簡單,編碼時它將3個字符順序放入一個 24 位的緩沖區(qū),缺字符的地方補零,然后將緩沖區(qū)截斷成為 4 個部分,高位在先,每個部分 6 位,用下面的64個字符重新表示:
"`!"#$%&’()*+,-./0123456789:;<=>?@abcdefghijklmnopqrstuvwxyz[\]^_"
在
文件的開頭有“begin xxx
被編碼的文件名”,在文件的結(jié)尾有“end”,用來標志uue文件的開始和結(jié)束。編碼時,每次讀取源文件的45個字符,不足45個的用“null”補足為
3的整數(shù)倍(如:23補為24),然后輸入目標文件一個ascii為:“32+實際讀取的字符數(shù)”的字符作為每一行的開始。讀取的字符編碼后輸入目標文
件,再輸入一個“換行符”。如果源文件被編碼完了,那么輸入“`(ascii為96)”和一個“換行符”表示編碼結(jié)束。
解碼時它將4個字符分別轉(zhuǎn)換為4個6位字符后,截取有用的后六位放入一個 24 位的緩沖區(qū),即得3個二進制代碼。
四、其他:
1、由于郵件編/解碼要消耗大量的CUP資源,所以郵件中不適合附加太大的附件程序,否則在閱讀郵件和發(fā)送郵件時會導致資源消耗太多而死機。
2、由于郵件編碼可能會增加容量,加上郵件頭,所以實際郵件的大小比附加的附件加上郵件文本內(nèi)容的大小和要大的多。
該文章在 2012/2/17 0:35:17 編輯過