MIME 編碼方式簡介

2021-04-12 18:24:40 字數 2532 閱讀 9033

subject: =?gb2312?b?xoo6w6oh?=

這裡是郵件的主題,可是因為編碼了,我們看不出是什麼內容,其原來的文字是:

「你好!」我們先看看 mime 編碼的兩種方法。

對郵件進行編碼最初的原因是因為 internet 上的很多閘道器不能正確傳輸8 bit 內

碼的字元,比如漢字等。編碼的原理就是把 8 bit 的內容轉換成 7 bit 的形式以能正

確傳輸,在接收方收到之後,再將其還原成 8 bit 的內容。

mime 是「多用途網際郵件擴充協議」的縮寫,在 mime 協議之前,郵件的編碼曾經

有過 uuencode 等編碼方式 ,但是由於 mime 協議演算法簡單,並且易於擴充套件,現在已經

成為郵件編碼方式的主流,不僅是用來傳輸 8 bit 的字元,也可以用來傳送二進位制的文

件 ,如郵件附件中的影象、音訊等資訊,而且擴充套件了很多基於mime 的應用。從編碼方

式來說,mime 定義了兩種編碼方法base64與qp(quote-printable) :

base 64 是一種通用的方法,其原理很簡單,就是把三個byte的資料用 4 個byte表

示,這樣,這四個byte 中,實際用到的都只有前面6 bit,這樣就不存在只能傳輸 7bi

t 的字元的問題了。base 64的縮寫一般是「b」,像這封信中的subject 就是用的 bas

e64 編碼。

另一種方法是qp(quote-printable) 方法,通常縮寫為「q」方法,其原理是把乙個

8 bit 的字元用兩個16進製制數值表示,然後在前面加「=」。所以我們看到經過qp編碼

後的檔案通常是這個樣子:=b3=c2=bf=a1=c7=e5=a3=ac=c4=fa=ba=c3=a3=a1。

在 php 裡,系統有兩個函式可以很方便地實現解碼:base64_decode()與quoted

_printable_decode(),前者可用於base64 編碼的解碼,後者是用於 qp 編碼方法的

解碼。現在我們再來看看subject: =?gb2312?b?xoo6w6oh?= 這一主題的內容,這不是一段

完整的編碼,只有部分是編碼了的,這個部分用 =? ?= 兩個標記括起來,=? 後面說明

的是這段文字的字符集是 gb2312 ,然後乙個 ? 後面的乙個 b 表示的是用的 base64 

mime-version: 1.0

表示使用的 mime 的版本號,一般是1.0;

content-type: 定義了正文的型別,我們實際上是通過這個標識來知道正文內是什

麼型別的檔案,比如:text/plain 表示的是無格式的文字正文,text/html 表示的 ht

ml 文件,image/gif 表示的是 gif 格式的等等。在本文中特別要說明一下的是郵

件中常用到的復合型別。multipart 型別表示正文是由多個部分組成的,後面的子型別

說明的是這些部分之間的關係,郵件中用到的三個型別有,multipart/alternative:表

示正文由兩個部分組成,可以選擇其中的任意乙個。主要作用是在徵文同時有 text 格

式和 html 格式時,可以在兩個正文中選擇乙個來顯示,支援 html 格式的郵件客戶端

軟體一般會顯示其 html 正文,而不支援的則會顯示其 text 正文;multipart/mixed

:表示文件的多個部分是混合的,指正文與附件的關係。如果郵件的 mime 型別是mult

ipart/mixed,即表示郵件帶有附件;multipart/related :表示文件的多個部分是相關

的,一般用來描述 html 正文與其相關的。

這些復合型別又是可以巢狀使用的,比如說乙個帶有附件的郵件,同時有 html 與

text 兩種格式的正文,則郵件的結構是:

content-type: multipart/mixed

部分一:

content type : multipart/alternative:

text 正文;

html 格式的正文 

部分二:

附件郵件結束符;

由於復合型別由多個部分組成,因此,需要乙個分隔符來分隔這多個部分,這就是

上面的郵件原始檔中的boundary="----=_nextpart_000_0007_01c03166.5b1e9510"所描

述的,對於每乙個contect type :multipart/* 的內容,都會有這麼乙個說明,表示多

個部分之間的分隔,這個分隔符是正文中不可能出現的一串古字元的組合,在文件中,

以 "--" 加上這個boundary 來表示乙個部分的開始,在文件的結束,以"--"加bounda

ry再在最後加上 "--" 來表示文件的結束。由於復合型別是可以巢狀使用的,因此,郵

件中可能會多個 boundary 。

還有乙個最重要的 mime 頭標籤:

content-transfer-encoding: base64 它表示了這個部分文件的編碼方式,也就是

我們上面所介紹的base64或qp(quote-printable)。我們只有識別了這個說明,才能用正

確的解碼方式實現對其解碼。

文字編碼簡介

字元編碼概述 下表,按照固定長編碼和可變長編碼進行分類。gb2312和gbk如果從與ascii碼相容的角度來講,也可以認為是可變長編碼。對於ascii碼以外的文字都是2位元組編碼。ucs和unicode在1991年已經統一 ascii編碼 前32個字元 0x00 0x1f 為控制字元 33到126 ...

中文編碼簡介

中文字庫有關的常見編碼有 單位元組編碼 gb2312 80 gb12345 90 gbk unicode編碼 unicode字符集 big5編碼。下面簡要介紹一下 1.gb2312 80 全稱是gb2312 80 資訊交換用漢字編碼字符集 基本集 1980年發布,是中文資訊處理的國家標準,在大陸及海...

字元編碼簡介

ascii ascii american standard code for information interchange,美國資訊交換標準 是一種單位元組編碼。計算機起源於美國,早期計算機中使用的只有英文,沒有其他的語言,而單位元組可以表示 2 8 1 即255 個字元,可以表示所有的英文本元及...