Elegir y aplicar una codificación de caracteres

Público al que va dirigido: Codificadores HTML (que usan editores o scripts), desarrolladores de scripts (PHP, JSP, etc.), codificadores CSS, jefes de proyectos Web, y cualquiera que sea nuevo en codificación de caracteres y necesite una introducción a cómo elegir y aplicar codificación de caracteres.

Pregunta

¿Qué codificación de caracteres debo utilizar para mi contenido y cómo la aplico a mi contenido?

El contenido se compone de una secuencia de caracteres. Los caracteres representan letras del alfabeto, puntuación, etc. Pero el contenido se almacena en un ordenador como una secuencia de bytes, que son valores numéricos. A veces se utiliza más de un byte para representar un único carácter. Al igual que los códigos utilizados en el espionaje, la forma en que la secuencia de bytes se convierte en caracteres depende de la clave que se haya utilizado para codificar el texto. En este contexto, esa clave se denomina codificación de caracteres.

Este artículo ofrece consejos sencillos sobre qué codificación de caracteres utilizar para el contenido, y cómo aplicarla, es decir, cómo producir realmente un documento en esa codificación.

Para comprender mejor qué son los caracteres y las codificaciones de caracteres, consultar el artículo Codificaciones de caracteres para principiantes.

Respuesta rápida

Elegir UTF-8 para todo el contenido y considerar la posibilidad de convertir cualquier contenido de las codificaciones heredadas a UTF-8.

Si realmente no se puede utilizar una codificación Unicode, comprobar que existe una amplia compatibilidad con el navegador para la codificación de la página que se ha seleccionado, y que la codificación no está en la lista de codificaciones que se deben evitar según las especificaciones recientes.

Comprobar si la elección se verá afectada por la configuración server-side.

Además de declarar la codificación del documento dentro del documento y/o en el servidor, es necesario guardar el texto en esa codificación para aplicarlo a su contenido.

Los desarrolladores también necesitan asegurarse de que las diversas partes del sistema puedan comunicarse entre sí.

Más detalles

Aplicar una codificación al contenido

Los autores de los contenidos deben declarar la codificación de caracteres de sus páginas utilizando uno de los métodos descritos en Declaración de codificaciones de caracteres en HTML.

Sin embargo, es importante entender que el simple hecho de declarar una codificación dentro de un documento o en el servidor no cambiará los bytes; es necesario guardar el texto en esa codificación para aplicarlo a su contenido. (La declaración sólo ayuda al navegador a interpretar las secuencias de bytes en los que se almacena el texto.)

Si necesario, configure UTF-8 como el valor predeterminado para los nuevos documentos en su editor. La siguiente imagen muestra cómo lo haría en las preferencias de un editor como Dreamweaver.

Las nuevas preferencias de documento de DreamWeaver le permiten especificar una codificación predeterminada.

También es posible que tenga que comprobar que su servidor está entregando documentos con las declaraciones HTTP correctas, ya que, de lo contrario, anulará la información contenida en el documento (véase más adelante).

Los desarrolladores también necesitan asegurarse de que las diversas partes del sistema puedan comunicarse entre sí. Las páginas web deben ser capaces de comunicarse perfectamente con los scripts de back-end, bases de datos, etc. Estos, por supuesto, todos ellos funcionan mejor con UTF-8, también. Los desarrolladores pueden encontrar un conjunto detallado de cosas a considerar en el artículo Migración a Unicode.

¿Por qué usar UTF-8?

Una página HTML sólo puede estar en una codificación. No se pueden codificar diferentes partes de un documento en diferentes codificaciones.

Una codificación basada en Unicode como UTF-8 puede soportar muchos idiomas y puede acomodar páginas y formularios en cualquier mezcla de esos idiomas. Su uso también elimina la necesidad de que la lógica del server-side determine individualmente la codificación de caracteres para cada página servida o cada envío de formulario entrante. Esto reduce significativamente la complejidad de tratar con un sitio o aplicación multilingüe.

Una codificación Unicode también permite mezclar muchos más idiomas en una sola página que cualquier otra opción de codificación.

Cualquier barrera para usar Unicode es muy baja en estos días. De hecho, en enero de 2012 Google informó que más del 60% de la Web en su muestra de varios miles de millones de páginas estaba usando UTF-8. Agregue a esto la cifra de páginas web sólo ASCII (ya que ASCII es un subconjunto de UTF-8), y la cifra se eleva a alrededor del 80%.

Hay tres codificaciones de caracteres Unicode diferentes: UTF-8, UTF-16 y UTF-32. De estos tres, sólo UTF-8 debe utilizarse para el contenido de la Web. La especificación HTML5 dice "Se anima a los autores a utilizar UTF-8. Los verificadores de conformidad pueden aconsejar a los autores que no utilicen codificaciones heredadas. Las herramientas de autoría deberían usar UTF-8 por defecto para los documentos recién creados"

Tenga en cuenta, que todos los caracteres ASCII en UTF-8 utilizan exactamente los mismos bytes que una codificación ASCII, lo que a menudo ayuda a la interoperabilidad y a la compatibilidad con versiones anteriores.

Tener en cuenta la cabecera HTTP

Cualquier declaración de codificación de caracteres en el encabezado HTTP anulará las declaraciones dentro de la página. Si el encabezado HTTP declara una codificación que no es la misma que la que desea utilizar para su contenido, esto causará un problema a menos que pueda cambiar la configuración del servidor.

Es posible que no tenga control sobre las declaraciones que vienen con el encabezado HTTP y que tenga que ponerse en contacto con las personas que administran el servidor para obtener ayuda. Por otro lado, a veces hay formas de arreglar las cosas en el servidor si tiene acceso limitado a los archivos de configuración del servidor o si está generando páginas utilizando lenguajes de scripting. Por ejemplo, véase Configuración del parámetro de conjunto de caracteres HTTP para obtener más información sobre cómo cambiar la información de codificación, ya sea localmente para un conjunto de archivos en un servidor o para contenido generado utilizando un lenguaje de scripting.

Normalmente, antes de hacerlo, debe comprobar si la cabecera HTTP está declarando la codificación de caracteres. Puede utilizar el W3C Internationalization Checker para averiguar qué codificación de caracteres, si existe, se especifica en el encabezado HTTP. Alternativamente, el artículo Comprobación de cabeceras HTTP apunta a otras herramientas para comprobar la información de codificación pasada por el servidor.

Información adicional

La información de esta sección se refiere a cosas que normalmente no debería necesitar saber, pero que se incluyen aquí para que estén completas.

¿Qué pasa si no puedo usar UTF-8?

Si realmente no puede evitar utilizar una codificación de caracteres que no sea UTF-8, tendrá que elegir entre un conjunto limitado de nombres de codificación para garantizar la máxima interoperabilidad y el mayor tiempo posible de legibilidad para su contenido, y para minimizar las vulnerabilidades de seguridad.

Hasta hace poco, el registro de IANA era el lugar para encontrar nombres para las codificaciones. El registro de IANA suele incluir varios nombres para la misma codificación. En este caso, debe utilizar el nombre designado como "preferido".

La nueva especificación Codificación ahora proporciona una lista que ha sido probada contra las implementaciones reales del navegador. Puede encontrar la lista en la tabla en la sección llamada Codificaciones. Es mejor usar los nombres en la columna izquierda de esa tabla.

Tenga en cuenta, sin embargo, que la presencia de un nombre en cualquiera de estas fuentes no significa necesariamente que esté bien usar esa codificación. Consulte la siguiente sección para ver las codificaciones que debe evitar.

Evitar estas codificaciones

La especificación HTML5 indica una serie de codificaciones que debe evitar.

Los documentos no deben utilizar JIS_C6226-1983, JIS_X0212-1990, HZ-GB-2312, JOHAB (código de Windows página 1361), codificaciones basadas en ISO-2022, o codificaciones basadas en EBCDIC. Esto se debe a que permiten que los puntos de código ASCII representen caracteres no ASCII, lo que supone una amenaza para la seguridad.

Los documentos tampoco deben utilizar codificaciones CESU-8, UTF-7, BOCU-1 o SCSU , ya que nunca han sido diseñados para contenido Web y la especificación HTML5 prohíbe que los navegadores los reconozcan.

La especificación también desalienta fuertemente el uso de UTF-16, y el uso de UTF-32 es "especialmente desalentado".

También deben evitarse otras codificaciones de caracteres que figuran en la especificación de codificación . Estos incluyen codificaciones Big5 y EUC-JP , que tienen problemas de interoperabilidad. ISO-8859-8 (codificación en hebreo para texto ordenado visualmente ) también debe evitarse, en favor de una codificación que funcione con texto ordenado de forma lógica (es decir, en inglés). UTF-8 o, en su defecto, ISO-8859-8-i).

La codificación replacement, que figura en la especificación de codificación , no es en realidad una codificación; es un método alternativo que asigna cada octeto al punto de código Unicode U+FFFD REPLACEMENT CHARACTER. Obviamente, no es útil transmitir datos en esta codificación.

La codificación x-user-defined es una codificación de un solo byte cuya mitad inferior es ASCII y cuya mitad superior está asignada al Área de uso privado Unicode (PUA). Al igual que la PUA en general, es mejor evitar el uso de esta codificación en la Internet pública porque daña la interoperabilidad y el uso a largo plazo.