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.
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
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
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). –