春天花會開

          ***********

          統計

          留言簿(4)

          閱讀排行榜

          評論排行榜

          [轉載]MIME郵件的編碼方式

          轉自:http://book.csdn.net/bookfiles/402/10040214756.shtml

          MIME郵件的編碼方式

          由于每個ASCII碼字符只占用一個字節(8個bit位),且最高bit位總為0,即ASCII碼字符中的有真正意義的信息只是后面的7個低bit位,而傳統的SMTP協議又是基于ASCII碼字符設計的,因此,一些基于傳統SMTP協議設計的SMTP服務器在處理郵件內容時只取出每個字節中的7個低bit位進行處理,而將最高bit位忽略不計。顯然,這樣的SMTP服務器在處理包含有非ASCII碼字符的郵件內容時,會出現嚴重的問題,這就限制了郵件中只能出現英文的ASCII碼字符,而不能出現中文字符或二進制數據。

          為了能夠在郵件內容中包含中文、圖像或聲音等非ASCII字符的數據,人們想到了采用某種編碼方式將非ASCII字符的數據轉換成可打印的ASCII字符后再發送,郵件閱讀程序則按照相應的解碼方式從郵件中還原出原始數據即可,比較常用的兩種郵件編碼方式為BASE64和Quoted-printable。后來的擴展SMTP協議允許直接在郵件中傳遞二進制數據,而不用對它們進行郵件編碼,人們將這種沒有進行郵件編碼的二進制數據的郵件內容稱為8bit編碼,為了與此相區別,人們將沒有進行郵件編碼的純ASCII碼字符的郵件稱為7bit編碼。MIME消息體的郵件編碼方式通過MIME消息頭中的Content- Transfer- Encoding頭字段指定,每種郵件編碼方式的介紹如下:

          —  7Bit

          指消息體內容全部是沒有經過編碼的ASCII字符。

          —  8Bit

          指消息體內容是沒有經過編碼的原始數據,且其中包含有非ASCII字符的數據?,F在的郵件服務器基本上都支持8Bit編碼,使用支持8Bit編碼的郵件服務器可以簡化郵件的處理過程。

          —  BASE64

          Base64是將二進制數據轉換成可打印的ASCII字符的一種最常見的編碼方式,它的基本原理是將一組連續的字節數據按6個bit位進行分組,然后對每組數據用一個ASCII字符來表示。6個bit位最多能表示26=64個數值,因此可以使用64個ASCII字符來對應這64個數值,這64個ASCII字符為:

          "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"

          其中每個字符表示的數值就是該字符在上面的排列中的索引號,索引號從0開始編號。假設在內存中有如下三個連續的字節數據:

          [0110,0001] [0110,0010] [0110,0011]

          將它們按6個bit位進行分組后的形式如下:

          [0110,00] [01,0110,] [0010,01] [10,0011]

          分組后得到了四組數據,每組數據對應的十進制數值分別為24、22、9、35,它們分別對應Y、W、J、j這四個字符,所以,對[0110,0001] [0110,0010] [0110,0011]這三個字節的數據進行BASE64編碼后的結果是“YWJj”。

          BASE64編碼要求把3個8位字節(即24個bit)的數據轉化為4個6位字節(也是24個bit)的數據,如果原來的8位字節數據的字節個數不能被3整除,其余數只能是1或2,那么如何對余下的1個或2個8位字節數據進行處理呢?對于這種情況,仍然按6個bit位對剩余的字節進行分組,在最后不夠6個bit位的內容后面添加幾個為0的bit位來湊成6個bit位,例如,如果最后剩下的一個8位字節的內容如下:

          [0110,0001]

          對它進行分組后的結果如下:

          [0110,00] [01,0000]

          其中用黑斜體標識的0為填充的bit位,所以,最后剩下的這個字節的BASE64編碼結果為“YQ”。BASE64編碼還有規定,如果編碼后的整個結果文本的字符個數不是4的整數倍,那么需要在最后填充“=”字符來湊成4的倍數,所以,在最后這個字節編碼的結果后面還要添加兩個“=”字符,即“YQ==”。顯然,如果最后剩下兩個8位字節的內容,它可以被編碼成三個字符,最后還需要添加一個“=”字符。對一大段數據進行BASE64編碼時,可以在編碼結果中的適當位置加入回車換行,MIME規范建議BASE64編碼結果中的每行最多76個字符。

          —  Quoted-printable

          Quoted-printable也是一種將二進制數據轉換成可打印的ASCII字符的編碼方式,它對ASCII字符不進行轉換,只對非ASCII字符的數據進行編碼轉化。每個非ASCII字符的字節數據,都被轉換成一個"="號后跟這個字節的十六進制數據,例如,“ab中國”的Quoted-printable編碼結果為“ab=d6=d0=b9= fa”。顯然,由于"="號在Quoted-printable編碼中具有的特殊意義,所以,原始數據中的"="號字符也需要進行編碼轉換,用“=3d”表示。

          對一大段數據進行Quoted-printable編碼時,可以在編碼結果中的適當位置加入回車換行,在回車換行前需要額外再加入一個“=”字符,以表示后面的換行是因編碼而造成的軟回車,而非原始數據中原有的回車換行。例如,對于下面一段Quoted-printable編碼后的數據:

          =D5=E2=CA=C7=CD=A8=D0=C5=B5=C4=B3=CC=D0=

          =F2, =C7=EB=D6=B8=BD=CC!

          在第一行末尾的“=”字符和換行,都是由于編碼后生成的。



          posted on 2008-07-31 10:52 春天花會開 閱讀(2664) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 和政县| 新巴尔虎左旗| 永福县| 阿城市| 柳林县| 突泉县| 山阳县| 荥阳市| 怀仁县| 龙口市| SHOW| 孙吴县| 绵阳市| 三原县| 阳山县| 卓资县| 金门县| 东明县| 开封市| 广州市| 临湘市| 灵璧县| 玉龙| 彰化县| 嘉义市| 黄骅市| 铜川市| 昭平县| 阿拉善盟| 五家渠市| 纳雍县| 沛县| 马龙县| 神农架林区| 旌德县| 崇州市| 巴彦淖尔市| 新竹市| 湘潭市| 榕江县| 临潭县|