春天花會開

          ***********

          導航

          <2008年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          隨筆檔案(18)

          文章檔案(1)

          相冊

          統計

          留言簿(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字符的數據。現在的郵件服務器基本上都支持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 春天花會開 閱讀(2663) 評論(0)  編輯  收藏


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


          網站導航:
           
          主站蜘蛛池模板: 民县| 娄烦县| 福州市| 红河县| 嘉兴市| 长白| 晋宁县| 武邑县| 曲阳县| 长垣县| 贵定县| 格尔木市| 远安县| 简阳市| 灵宝市| 南乐县| 烟台市| 天镇县| 沙雅县| 新源县| 平罗县| 广灵县| 西宁市| 明星| 邢台市| 昔阳县| 柳江县| 鄱阳县| 漾濞| 东兴市| 中阳县| 平江县| 荃湾区| 昌宁县| 长海县| 平原县| 荥经县| 长顺县| 合阳县| 闸北区| 年辖:市辖区|