2010-05-05 29 views
36

這是一個例子原始郵件我試圖解析:在MIME編碼的帶引號的可打印文本中,「= C2 = A0」是什麼?

MIME-version: 1.0 
Content-type: text/html; charset=UTF-8 
Content-transfer-encoding: quoted-printable 
X-Mailer: Verizon Webmail 
X-Originating-IP: [x.x.x.x] 

=C2=A0test testing testing 123 

什麼是= C2 = A0?我已經嘗試了六打引用可打印的解析器,但沒有正確處理這個問題。 如何正確解析這在C#中?

老實說,現在,我編碼:

//TODO WTF 
encoded = encoded.Replace("=C2=A0", ""); 

因爲我想不通,爲什麼該文本是有內部的MIME內容隨意,不應該被渲染成什麼。通過刪除它,我得到了預期的效果 - 但爲什麼?!

要清楚,我知道(= [0-9A-F] {2})是一個編碼字符。但在這種情況下,它似乎代表什麼。

回答

69

「= C2 = A0」表示字節C2A0。但是,由於這是UTF-8,它將轉換爲00A0,這是不分段空間的Unicode。

請參閱http://en.wikipedia.org/wiki/UTF-8

+0

解析C#中的這種方法是什麼?我試過的所有解析器都對每個字符獨立進行操作,並執行以下操作:int iHex = Convert.ToInt32(hex,16); char c =(char)iHex; – TheSoftwareJedi 2010-05-05 15:31:33

+0

是否UTF-8總是以這樣的2個字節編碼?我可以假設(= [0-9A-F] {2} = [0-9A-F] {2})而不是單個字節的匹配嗎?爲什麼地獄不在這裏解析器?!?!?!?! – TheSoftwareJedi 2010-05-05 15:35:23

+11

如果您閱讀了UTF-8,您會發現任何超過7F的單字節值都必須編碼爲兩個字符,並且第一個字符總是會設置爲高位。所以,是的,A0總是被編碼爲C2 A0,這意味着你不能逐字節。用引號編碼處理UTF-8的正確方法是首先解碼引用的部分,然後解碼UTF-8,從而生成由2字節字符(技術上爲UCS-16或UTF-16)組成的字符串。 – 2010-05-05 15:52:46

相關問題