2010-05-05 8 views
36

Questo è un esempio e-mail cruda che sto cercando di analizzare:Che cosa significa "= C2 = A0" nel codice MIME, testo quotato e stampabile?

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 

Ciò che è = C2 = A0? Ho provato una mezza dozzina di parser stampabili, ma nessuno lo gestisce correttamente. Come si analizza correttamente questo in C#?

Onestamente, per ora, sto codifica:

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

Perché io non riesco a capire il motivo per cui il testo è là in modo casuale all'interno del contenuto MIME, e non dovrebbe essere reso in qualsiasi cosa . Semplicemente rimuovendolo, sto ottenendo l'effetto desiderato - ma PERCHÉ ?!

Per essere chiari, so che (= [0-9A-F] {2}) è un carattere codificato. Ma in questo caso, sembra rappresentare NIENTE.

risposta

69

"= C2 = A0" rappresenta i byte C2 A0. Tuttavia, poiché questo è UTF-8, si traduce in 00A0, che è l'Unicode per lo spazio non-breaking.

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

+0

Qual è il modo per analizzare questo in C#? Tutti i parser che ho provato operano su ogni char in modo indipendente, e lo fanno: int iHex = Convert.ToInt32 (hex, 16); char c = (char) iHex; – TheSoftwareJedi

+0

UTF-8 codifica sempre in 2 byte come questo? Posso assumere una corrispondenza di (= [0-9A-F] {2} = [0-9A-F] {2}) invece del singolo byte? Perché diavolo non c'è un parser per questo?!?!?!?! – TheSoftwareJedi

+11

Se si legge su UTF-8, vedrete che ogni valore a byte singolo che supera 7F deve essere codificato in due caratteri, e il primo avrà sempre il suo bit alto impostato. Quindi, sì, A0 è sempre codificato come C2 A0, il che significa che non puoi andare byte per byte. Il modo corretto di gestire UTF-8 con quoted-encoding consiste nel decodificare prima la parte quotata e decodificare l'UTF-8, ottenendo una stringa composta da caratteri a 2 byte (tecnicamente UCS-16 o UTF-16). –