2010-05-05 72 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