Un amigo esta realizando un proyecto en Visual Basic .Net, que entre otras cosas se conecta a GMail para recibir correos e introducirlos en una base de datos para mostrarlos en un panel de administración. Hasta aquí todo normal, el problema viene cuando en los correos utiliza caracteres, que vamos a llamar extraños, como tildes por ejemplo. Cuando recibimos por código un mail que por ejemplo contenía la cadena «conexión», este texto no se nos devuelve así, sino que nos devolvería «conexi=F3n» y he aqui el problema, ya que esto no es codificación normal de UTF-8 a ASCII o similares sino que es completamente diferente.
Los servidores de correo utilizan protocolos bastante antiguos, en los que todo se basta en texto. Para separar encabezados se utilizan saltos de linea tipo «rn» o «n» y por ejemplo para adjuntar archivos hay que declarar una marca y decirle que el contenido del archivo esta entre marca y marca. Como no, todo esta basado en texto ASCII por lo que los caracteres extraños, letras con acento, eñes y similares, suelen encontrarse en una codificación que se llama «Quoted printable».
Quoted Printable o simplemente acortado QP es un sistema de codificación de 8 bits compatible con ASCII que basa su codificación de caracteres extraños en un formato de un símbolo igual seguido de 2 posiciones hexadecimales. Se rige por el estándar RFC-1345. Aunque algunos lenguajes traen incorporado por defecto funciones o librerías para codificación y descodificación de caracteres, .Net no tiene nada para descodificar este tipo de codificación. A continuación os mostrare un ejemplo de función de Visual Basic para la descodificación de estos caracteres, que básicamente recoge estos caracteres hexadecimales, los convierte a entero y obtiene el caracter de ASCII extendido de 255 caracteres, no el tradicional de 128 caracteres. De esta forma, obtendrá el carácter correcto ya traducido. Os dejo el ejemplo de la función:
Función de descodificación de cadenas de texto Quoted Printable
Public Shared Function QuotedPrintableDecode(ByVal text As String) _ As String Dim i As Integer Dim DecodedString As StringBuilder Dim Chars As Char() Dim CharsValue As String Dim HexValue As Integer Chars = text.ToCharArray() DecodedString = New StringBuilder For i = 0 To Chars.Length - 1 If Chars(i) = "=" Then CharsValue = Nothing HexValue = Nothing If Chars(i + 1) = "0" Then CharsValue = Chars(i + 2) Else CharsValue = Chars(i + 1) & Chars(i + 2) End If HexValue = Val("&H" & CharsValue) If CharsValue.ToUpper = Hex(HexValue) Then DecodedString.Append(ChrW(HexValue)) i += 2 Else DecodedString.Append(Chars(i)) End If Else DecodedString.Append(Chars(i)) End If Next Return DecodedString.ToString End Function
Ahora solo hace falta llamar a esa función pasando la cadena a convertir:
Public Shared Sub Main() Dim text As String = "conexi=F3n" Console.WriteLine(Application.QuotedPrintableDecode(text)) End Sub
El resultado de aplicar esto seria la cadena «conexión». Para que funcione es necesario importar el namespace System.Text, pero solo para el StringBuilder
Imports System.Text
Espero que os sirva de ayuda.