Codificación Unicode

Ya que tengo alguna que otra primavera a cuestas y que suelo ganarme la vida, entre otras cosas, impartiendo clases, reconozco que tengo alguna que otra manía. Una de estas manías está estrechamente ligada con la ortografía (u hortografía, como vi no hace mucho en el escrito de un alumno).

Hace poco, en la creación de una página web, el cliente solicitó uno de aquellos enlaces que, al hacer un clic sobre él, se abriera el cliente de correo. Para la mayor parte de clientes, sólo existe el Outlook y, sinceramente, creo que es mejor porque hace muy poquito, el jefe de una empresa en la que trabajo me comentó que quería usar el OpenOffice y, claro, iba a instalar el “gestor de correos del OpenOffice, es decir, el Ubuntu” –casi me da algo- Lástima que no sé callar, puesto que se hubiera merecido instalar este “cliente de correo” sobre el Windows XP, más que nada, por la supremacía que intentaba transmitir al hablarme del tema…

Bueno, siempre suelo irme por las ramas, así que retomo el tema inicial. El caso es que quería añadir, en una página HTML un enlace para que se abriese el Outlook del visitante al site, así que, como una vez hice un cursillo de HTML, me pongo a teclear:

<HTML>
 <HEAD>
  <TITLE> Mail Sample </TITLE>
 </HEAD>
 <BODY>
  <a
    href="mailto:usuario@dominio.com
      ?subject=Solicitud de información
      &body=Les agradecería se sirvan remitirme información adicional acerca de:
      ">
      Texto del enlace
</a>
 </BODY>
</HTML>

A partir de aquí, haces las pruebas y todo va bien, puesto que yo también suelo usar IE y Outlook. El problema empieza a sospecharse cuando recibes correos con caracteres extraños y empiezas a probar con algún explorador diferente, como Firefox. El resultado viene a ser el siguiente:

image

¡Cáspita! Los acentos no acaban de verse como yo esperaba.

La verdad es que no sé si existe alguna solución sencilla para arreglar esto, pero entre que una vez estudié algo de codificación en la asignatura “Estructura de computadores” y que soy retorcido por naturaleza, hecho mano de VisualStudio y me pongo a intentar encontrar una solución.

Tras estar un rato buscando en las clases de .Net Framework, veo que existe una clase dedicada a la conversión entre codificaciones de caracteres, la clase System.Text.Encoding, así que no resulta difícil crear una función que convierta una serie de caracteres escritos en ASCII a Unicode:

using System;
using System.Text;

namespace JnSoftware.Utiles.CodificacionUnicode
{
    /// <summary>
    /// Servicios de codificación Unicode
    /// </summary>
    class CodificacionUnicode
    {
        /// <summary>
        /// Devuelve la cadena pasada como parámetro en formato 
        /// Unicode
        /// </summary>
        public static string CodificaUnicode(string texto)
        {
            /* Tipo de codificación */
            System.Text.Encoding codificacion = System.Text.Encoding.Unicode;

            /* Se crea una matriz de CHAR con los carácteres de la cadena que 
             * se quiere codificar */
            Char[] caracteres = texto.ToCharArray();

            /* Conversión de la cadena en una matriz de Bytes */
            Byte[] bytesCodificados = codificacion.GetBytes(caracteres);

            /* Se crea un StringBuilder para poder traspasar los bytes ya 
             * codificados */
            StringBuilder sb = new StringBuilder();

            /* Bucle que añade los bytes codificados. Se puede aprovechar para 
             * poder comprobar caracteres especiales*/
            for (int c = 0; c < bytesCodificados.Length - 1; c++)
            {
                string byteActual = string.Format("%{0:X2}", bytesCodificados[c]);

                /* Se comprueba que no se trate del carácter "especial" del separador */
                if (!byteActual.Equals("%00"))
                    sb.Append(byteActual);
            }
            /* Valor de retorno */
            return sb.ToString();
        }
    }
}

Por cierto, una vez aplicada la función, el enlace queda un poco más “sucio”, pero mucho más compatible:

<a
  href="mailto:
    %75%73%75%61%72%69%6F%40%64%6F%6D%69%6E%69%6F%2E%63%6F%6D
    ?subject=%53%6F%6C%69%63%69%74%75%64%20%64%65%20%69%6E%66%6F%72%6D%61%63%69%F3%6E
    &body=%4C%65%73%20%61%67%72%61%64%65%63%65%72%ED%61%20%73%65%20%73%69%72%76%61%6E
          %20%72%65%6D%69%74%69%72%6D%65%20%69%6E%66%6F%72%6D%61%63%69%F3%6E%20%61%64
          %69%63%69%6F%6E%61%6C%20%61%63%65%72%63%61%20%64%65%3A
    ">
    Texto del enlace
  </a>

 

Nota: Reconozco que tenía esta entrada en el viejo blog, pero como tengo intención de cerrarlo definitivamente, intento “salvar” aquellas cosas que he ido necesitando después de escribirlas. En este caso, tan sólo me he limitado a traducirlo de C#.

2 thoughts on “Codificación Unicode

  1. ¿Y no se solucionaría de una manera mas facil si especificas los formatos y la codificación en las páginas web para que el browser no entre en modo «chapuzas»?

    Algo como esto al principio de las paginas web:
    < ?xml version="1.0" encoding="UTF-8"?>
    < !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

    ¿Lo soluciona? Cuentame…

  2. Pues la verdad es que la función la tenía desde hace tiempo y en su día, una de las cosas que recuerdo es que, independientemente de la cabecera (siempre trabajo con Visual Studio, así que las cabeceras me las pone ya por defecto), en IE se veía bien el mensaje, pero si entrabas desde Firefox aparecían los «caraceres raros».
    Lógicamente, la cabecera influye, pero no sé hasta qué punto es válida para todos los navegadores.

Responder a anonymous Cancelar respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *