2010-05-05 15 views
36

Jest to przykład surowego email Próbuję analizować:Co to jest "= C2 = A0" w zakodowanym MIME, cytowanym do wydruku tekście?

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 

Co = C2 = A0? Próbowałem kilkuset parserów quoted-printable, ale żaden nie obsługuje tego poprawnie. Jak jeden prawidłowo analizować to w języku C#?

Szczerze mówiąc, na razie mam kodowanie:

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

Ponieważ nie mogę zrozumieć, dlaczego ten tekst jest tam przypadkowo w treści MIME, a nie ma być renderowane do niczego . Po prostu go usuwam, uzyskuję pożądany efekt - ale DLACZEGO ?!

Aby było jasne, wiem, że (= [0-9A-F] {2}) jest zakodowaną postacią. Ale w tym przypadku pozornie reprezentuje NIC.

Odpowiedz

69

"= C2 = A0" oznacza bajty C2 A0. Jednakże, ponieważ jest to kodowanie UTF-8, oznacza to 00A0, czyli Unicode dla nierozdzielającej się przestrzeni.

Zobacz http://en.wikipedia.org/wiki/UTF-8

+0

Jaki jest sposób analizowania tego w języku C#? Wszystkie analizowane przeze mnie parsery działają niezależnie na każdym znaku i wykonaj to: int iHex = Convert.ToInt32 (hex, 16); char c = (char) iHex; – TheSoftwareJedi

+0

Czy UTF-8 zawsze koduje tak 2 bajty? Czy mogę przyjąć dopasowanie (= [0-9A-F] {2} = [0-9A-F] {2}) zamiast pojedynczego bajtu? Dlaczego do cholery nie ma parsera do tego?!?!?!?! – TheSoftwareJedi

+11

Jeśli czytasz na UTF-8, zobaczysz, że każda jednobajtowa wartość przekraczająca 7F musi być zakodowana na dwa znaki, a pierwszy zawsze będzie miał ustawiony wysoki bit. Tak więc, tak, A0 jest zawsze kodowane jako C2 A0, co oznacza, że ​​nie można przejść do bajtu po bajcie. Odpowiednim sposobem obsługi UTF-8 z kodowaniem cytowanym jest najpierw dekodowanie cytowanej części, a następnie dekodowanie UTF-8, w wyniku czego łańcuch składa się z 2-bajtowych znaków (technicznie UCS-16 lub UTF-16). –