2010-05-05 11 views
36

Este es un ejemplo de correo electrónico prima que estoy tratando de analizar:¿Qué es "= C2 = A0" en MIME codificado, texto imprimible entre comillas?

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 

¿Qué es = C2 = A0? He intentado una media docena de analizadores imprimibles entre comillas, pero ninguno maneja esto correctamente. ¿Cómo se podría analizar esto correctamente en C#?

Honestamente, por ahora, estoy de codificación:

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

Porque no puedo entender por qué ese texto no es al azar dentro del contenido MIME, y no se supone que debe ser dictada en cualquier cosa . Con solo quitarlo, obtengo el efecto deseado, pero ¿POR QUÉ?

Para ser claro, sé que (= [0-9A-F] {2}) es un carácter codificado. Pero en este caso, aparentemente no representa NADA.

Respuesta

69

"= C2 = A0" representa los bytes C2 A0. Sin embargo, dado que se trata de UTF-8, se traduce en 00A0, que es el Unicode para espacio sin interrupción.

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

+0

¿Cuál es la manera de analizar esto en C#? Todos los analizadores que he probado operan en cada char de manera independiente, y hago esto: int iHex = Convert.ToInt32 (hex, 16); char c = (char) iHex; – TheSoftwareJedi

+0

¿UTF-8 siempre codifica en 2 bytes de esta manera? ¿Puedo suponer una coincidencia de (= [0-9A-F] {2} = [0-9A-F] {2}) en lugar del byte único? ¿Por qué diablos no hay un analizador para esto?!?!?!?! – TheSoftwareJedi

+11

Si lee en UTF-8, verá que cualquier valor de un solo byte que exceda 7F tiene que codificarse en dos caracteres, y el primero siempre tendrá su bit alto establecido. Entonces, sí, A0 siempre está codificado como C2 A0, lo que significa que no puede ir byte a byte. La forma correcta de manejar UTF-8 con codificación entrecomillada es decodificar primero la parte entrecomillada y luego decodificar el UTF-8, lo que da como resultado una cadena compuesta de caracteres de 2 bytes (técnicamente UCS-16 o UTF-16). –

Cuestiones relacionadas