Codificación de formularios plurilingües

Intended audience: Los codificadores de XHTML/HTML (que utilizan editores o lenguajes de script), los desarrolladores de sistemas de escritura (PHP, JSP, etc.), los gerentes de proyectos web y toda persona que busque información sobre cómo utilizar las codificaciones de caracteres en los formularios.

Question

¿Cuál es la mejor manera de solucionar los problemas de codificación de los formularios que utilizan varios idiomas y sistemas de escritura?

Answer

La mejor manera de resolver los problemas de codificación en formularios (X)HTML es ejecutar todas las páginas en UTF-8. UTF-8 puede representar los caracteres de la mayor variedad de idiomas. Los navegadores envían los datos de los formularios con la misma codificación que la página que contiene el formulario; por ello, el usuario puede completar los datos en cualquier idioma y sistema de escritura que desee.

Existen algunos detalles a tener en cuenta para garantizar que esto funcione correctamente. En primer lugar, es importante indicar al navegador que la página del formulario se encuentra en UTF-8. Existen diferentes formas para indicar al navegador cuál es la codificación de su página. Esto es importante en todos los casos, pero aún más si la página de su formulario no contiene ningún caracter que no sea US-ASCII y los usuarios pueden escribir en otros caracteres.

En segundo lugar, es recomendable que el sistema de escritura que recibe los datos del formulario controle que los datos devueltos estén, en efecto, en UTF-8 (en caso de que se produzca algún error, por ej., que el usuario cambie la codificación). El control es posible ya que UTF-8 cuenta con un patrón de bytes muy específico que no se observa en ninguna otra codificación. Si se reciben datos en un formato distinto a UTF-8, se debe enviar un mensaje de error.

Por ejemplo, en Perl, una evaluación de expresión regular de UTF-8 se asemejaría a la siguiente:

$field =~
  m/\A(
     [\x09\x0A\x0D\x20-\x7E]            # ASCII
   | [\xC2-\xDF][\x80-\xBF]             # non-overlong 2-byte
   |  \xE0[\xA0-\xBF][\x80-\xBF]        # excluding overlongs
   | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}  # straight 3-byte
   |  \xED[\x80-\x9F][\x80-\xBF]        # excluding surrogates
   |  \xF0[\x90-\xBF][\x80-\xBF]{2}     # planes 1-3
   | [\xF1-\xF3][\x80-\xBF]{3}          # planes 4-15
   |  \xF4[\x80-\x8F][\x80-\xBF]{2}     # plane 16
  )*\z/x;

Esta expresión se puede adaptar a otros lenguajes de programación. Se ocupa de varios problemas, tales como codificaciones ilícitas excesivamente largas y el uso ilícito de derivaciones. Devolverá verdadero si $field es UTF-8 y falso en cualquier otro caso.