La tecla de acceso 'n' lleva a la navegación de la página. Ir al inicio del contenido.

Este documento es una traducción. En caso de discrepancias o errores, la única versión normativa es el último original en inglés. Los derechos de autor originales corresponden al W3C, como puede verse al final de la página.

Traductor: Spanish Translation Services by Trusted Translations, Inc.

s_gotoW3cHome Internacionalización
 

Declaración de codificaciones de caracteres en HTML

Audiencia de destino: Los codificadores de XHTML/HTML (que utilizan editores o lenguajes de script), los desarrolladores de sistemas de escritura (PHP, JSP, etc.), los codificadores CSS, los gerentes de proyectos web y cualquiera que necesite una introducción sobre cómo declarar la codificación de caracteres de su archivo (X)HTML o CSS.

Nota: Desde la traducción de este documento se han producido modificaciones en el original en Inglés. Consulte el registro de cambios.

Pregunta

¿Cómo debería declarar la codificación de mi archivo HTML?

Información preliminar

Siempre se debe especificar la codificación utilizada para una página HTML o XML. De lo contrario, se arriesga a que los caracteres de su contenido se interpreten incorrectamente. Esto no es sólo un problema de la capacidad de lectura del ser humano, sino que las máquinas, cada vez más, necesitan comprender su información, también. Además deberá verificar que no esté especificando codificaciones distintas en lugares distintos.

Este artículo ofrece un consejo simple sobre cómo crear las declaraciones necesarias. Lo hace de dos formas:

  1. ofrece un consejo simple que funciona para aquellos que sólo quieren obtener información rápida sobre lo que hay que hacer;
  2. proporciona más información para quienes desean comprender mejor el tema o explorar enfoques alternativos. Asume que lee primero la respuesta rápida.

Si necesita una mejor comprensión de lo que son los caracteres y las codificaciones de caracteres, consulte el artículo Codificación de caracteres para principiantes. Para obtener información sobre la declaración de codificaciones para hojas de estilo CSS, consulte Declaraciones de codificación de caracteres CSS.

Respuesta rápida

Aquí presentamos la información rápida del resumen para aquellos que sólo quieren obtener la información sobre lo que hay que hacer. Siga estos pasos:

  1. Decida si utilizará el encabezado HTTP.
  2. Verifique la tabla en las declaraciones del documento para el formato que está utilizando.
  3. Lea acerca de los nombres de codificación de caracteres.

Si no comprende el consejo de este resumen o desea comprender el razonamiento, los enlaces le llevarán a las secciones más abajo en la página que le proporcionarán ejemplos y explicaciones.

Encabezados HTTP

Definitivamente, deberá usar declaraciones del encabezado HTTP si es probable que el documento sea transcodificado (por ejemplo, la codificación de caracteres se cambiará por los servidores intermediarios), ya que las declaraciones HTTP tienen una precedencia mayor que las de los documentos.

De lo contrario, deberá utilizar los encabezados HTTP, si tiene sentido, para cualquier tipo de contenido, pero junto con una declaración en el documento (ver más adelante). Siempre deberá asegurarse de que las declaraciones HTTP sean consistentes con las declaraciones del documento.

Si su página está codificada como UTF-16, no declare su archivo como "UTF-16BE" o "UTF-16LE", use "UTF-16" solamente y envíe una marca de orden de bytes con su archivo.

Declaraciones del documento

En cada uno de los ejemplos que se encuentran a continuación, a menos que se indique de otra manera, sustituya el nombre charset en donde vea "UTF-8".

Formato Qué hacer
HTML5

Use el atributo metacharset en un metaelemento en la parte superior del elemento head y asegúrese de que toda la declaración quepa dentro de los primeros 1024 bytes de la página.

<meta charset="UTF-8">

HTML5 con UTF-16

Asegúrese de que haya una marca de orden de bytes al principio del archivo.

El grupo de trabajo HTML discute actualmente si puede utilizar la declaración de un metaelemento en el elemento head cuando la codificación es UTF-16. Por ahora, no se puede.

HTML4

Use una directiva pragma en la parte superior del elemento head.

<meta http-equiv="Content-type" content="text/html;charset=UTF-8">
XHTML 1.x servido con el tipo MIME text/html

Use UTF-8 para la decodificación de su página y utilice una directiva pragma en la parte superior del elemento head.

<meta http-equiv="Content-type" content="text/html;charset=UTF-8" />

(Si desea utilizar cualquier otra codificación para su contenido, lea la información detallada que aparece a continuación).

XHTML 1.x servido como XML

Use la declaración codificada de la declaración XML en la primera línea de la página. Asegúrese de que no haya nada antes, ni siquiera espacios (aunque una marca de orden de bytes está bien).

<?xml version="1.0" encoding="UTF-8"?>

Nombres de codificación de caracteres

Puede encontrar nombres para codificaciones de caracteres en el registro IANA. Deberá usar estos nombres para cada método que especifique una codificación de caracteres de los enumerados aquí. Tenga en cuenta que aunque a estos nombres IANA los denomina nombres charset, en realidad, se refieren a las codificaciones, no a los conjuntos de caracteres.

El registro IANA, por lo general, incluye varios nombres para la misma codificación. En este caso, deberá usar el nombre designado como "preferido".

Es posible inventar sus propios nombres de codificación precedidos por x-, pero esto no es una buena idea generalmente, ya que limita la interoperabilidad.

Tenga en cuenta que hay un guión en el nombre UTF-8.

Enfoques alternativos

Existen varias alternativas para los enfoques recomendados antes, pero involucran generalmente los pros y los contras. Para obtener más información, siga estos enlaces.

Más detalles

Aquí proporcionamos más información detallada sobre las distintas formas posibles de declarar información sobre caracteres codificados, comenzando por los encabezados HTTP y siguiendo con el listado de los distintos enfoques del documento para páginas no codificadas con UTF-16. Existe una subsección especial para las páginas codificadas como UTF-16.

Esta sección abarca lo siguiente:

El encabezado HTTP

La información Content-Type en el encabezado HTTP puede incluir información sobre la codificación de caracteres para el documento.

HTTP/1.1 200 OK
Date: Wed, 05 Nov 2003 10:46:04 GMT
Server: Apache/1.3.28 (Unix) PHP/4.2.3
...
Content-Type: text/html; charset=UTF-8
Content-Language: en

La codificación se puede especificar en el encabezado HTTP para archivos que contienen cosas tales como CSS y JavaScript, y no sólo el etiquetado HTML.

Si su documento se crea de forma dinámica mediante lenguajes de script, es probable que pueda agregar explícitamente esta información al encabezado HTTP. Por ejemplo, en PHP use la función del encabezado() antes de generar cualquier contenido, como podría ser:

<?php header('Content-type: text/html; charset=utf-8'); ?>
<!DOCTYPE html>
...

Si ejecuta archivos estáticos, el servidor puede asociar esta información con estos archivos. El método de configurar un servidor para pasar información de caracteres codificados de esta manera va a variar de un servidor a otro. Deberá verificarlo con el administrador del servidor.

Como ejemplo, los servidores Apache por lo general proporcionan una codificación predeterminada, la cual puede ser invalidada por las configuraciones del servidor. Por ejemplo, un usuario podría agregar la siguiente línea a un archivo .htaccess para servir todos los archivos con una extensión .html como UTF-8 en este y en todos los directorios menores:

AddType 'text/html; charset=UTF-8' html

Para obtener más información sobre el cambio de codificación en el encabezado HTTP, consulte la Configuración del parámetro charset HTTP.

Veamos si es apropiado declarar la codificación en el encabezado HTTP, dentro de la página o en ambos.

Ventajas

Desventajas

Entonces, ¿se debería utilizar este método?

Si se ejecutan archivos vía HTTP desde un servidor, nunca es un problema enviar la información acerca de la codificación de caracteres del documento en el encabezado HTTP, siempre que la información sea correcta.

Si cree que existe la posibilidad de que un intermediario pueda cambiar la codificación del archivo antes de que llegue al usuario (por ejemplo, transcodificada a una codificación reconocible a un teléfono móvil), puede considerar especialmente el uso de la declaración HTTP, ya que ahí es donde el cambio se llevará a cabo.

Por otra parte, debido a las desventajas enumeradas anteriormente, se recomienda que siempre declare la información codificada dentro del documento, también.

(Algunas personas podrían discutir que no es muy apropiado declarar la codificación en el encabezado HTTP si va a repetirse en el contenido del documento. En este caso, proponen que el encabezado HTTP no mencione nada acerca de la codificación del documento. Tenga en cuenta que esto, por lo general, significaría tomar una acción para deshabilitar cualquier información predeterminada del servidor).

El atributo metacharset

La especificación HTML5 describe una nueva forma de declarar la codificación para un documento que ya está respaldado por los principales navegadores. Se puede usar esto para las páginas escritas mediante el etiquetado HTML5. Alternativamente, se puede usar la directiva pragma, pero no se deberían usar ambas en la misma página.

Si usa esta declaración en páginas HTML4, el verificador HTML4 reclamará (aunque el navegador siga detectando la información).

La declaración se ve como se muestra a continuación.

<meta charset="UTF-8">

La especificación HTML5 requiere que todo el metaelemento quepa en los primeros 1024 bytes del documento, por lo que siempre se debe incluir en la parte superior del elemento head.

No se necesita estrictamente usar una declaración explícita si se usó UTF-8, pero es mejor hacerlo, porque permite una inspección visual de la codificación desde el código fuente. También puede habilitar un mejor soporte en los navegadores antiguos y en las herramientas de autoría.

Si codifica su página como UTF-16, consulte Uso de UTF-16.

La directiva pragma

Este es un metaelemento que deberá aparecer tan cerca como sea posible de la parte superior del elemento head y debe verse como se muestra a continuación:

<meta http-equiv="Content-type" content="text/html;charset=UTF-8">
Para sintaxis XHTML, siempre se debe tener " />" después del atributo de contenido, en lugar de sólo ">".

La codificación del documento se especifica justo después de charset=. En este caso, la codificación especificada es la Unicode, UTF-8.

La directiva pragma deberá usarse para páginas escritas en HTML 4.01. También se deberá usar para documentos XHTML 1.x servidos como HTML, ya que el analizador HTML no recogerá información codificada desde la declaración XML.

En HTML5 se puede usar este enfoque para declarar la codificación o el atributo metacharset especificado recientemente, pero no en la misma página. Además, la declaración de codificación deberá caber dentro de los primeros 1024 bytes del documento, por lo que generalmente se deberá poner inmediatamente después de la etiqueta de inicio del elemento head.

Esta codificación del documento permite que el documento se lea correctamente cuando no está en un servidor. Esto aplica no sólo a los documentos estáticos leídos del disco o CD, sino también a los documentos dinámicos guardados por el lector.

La declaración del documento también ayuda a los desarrolladores, analizadores o gerentes de producción de traducción que deseen verificar visualmente la codificación de un documento.

Si codifica su página como UTF-16, consulte Uso de UTF-16.

La declaración XML

La declaración XML se define por el estándar XML. Aparece en la parte superior de un archivo XML y soporta una declaración codificada. Por ejemplo:

<?xml version="1.0" encoding="UTF-8"?>

Una declaración XML es necesaria para un documento analizado como XML si la codificación del documento no es UTF-8 o UTF-16 y si la codificación no es proporcionada por un protocolo de un nivel más alto, es decir, el encabezado HTTP.

Esto es significativo, porque si se decide omitir la declaración XML, se debe elegir UTF-8 o UTF-16 como la codificación para la página si se va a utilizar sin HTTP.

Se debería usar una declaración XML para especificar la codificación de cualquier documento XHTML 1.x servido como XML.

Puede ser útil usar una declaración XML para páginas web servidas como XML, aun cuando la codificación es UTF-8 o UTF-16, porque una declaración del documento de este tipo también ayuda a los desarrolladores, analizadores o gerentes de producción de traducción a confirmar la codificación del archivo con una verificación visual del código fuente.

Uso de la declaración XML para XHTML servido como HTML. XHTML servido como HTML es analizado como HTML, aunque se base en sintaxis XML y, por lo tanto, una declaración XML no deberá ser reconocida por el navegador. Es por esta razón que se deberá usar una directiva pragma para especificar la codificación cuando se sirva XHTML de esta forma*.

* A la inversa, la directiva pragma, aunque válida, no es reconocida como una declaración de codificación por los analizadores XML.

Por otra parte, el archivo se puede usar en algún momento como dato ingresado para otros procesos que usen analizadores XML. Esto incluye cosas tales como editores XML, transformaciones XSLT, AJAX, etc. Además, algunas veces se usa un servidor lógico para determinar si el archivo se sirve como HTML o XML. Por estas razones, si no se utiliza UTF-8 o UTF-16, se deberá agregar una declaración XML al principio de la etiqueta, aunque se sirva al navegador como HTML. Esto haría que la parte superior de un archivo se viera así:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http‎://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-type" content="text/html;charset=ISO-8859-1" />
...

Sin embargo, si está usando UTF-8 o UTF-16, no hay necesidad de la declaración XML, sobre todo porque el metaelemento proporciona una inspección visual de la codificación de parte de los que procesan el archivo.

Atención para navegadores antiguos. Si aparece algo antes de la declaración DOCTYPE en Internet Explorer 6, la página se despliega en modo quirks. Si se utiliza UTF-8 o UTF-16, se puede omitir la declaración XML y no habrá problemas.

Sin embargo, sí podría ser un problema si no se usan estas codificaciones y los usuarios de Internet Explorer 6 continúan siendo una parte significativa de los lectores, y el documento contiene conceptos que se vean afectados por la diferencia entre el modo standards, comparado con el modo quirks. Si desea asegurar que sus páginas sean desplegadas de la misma forma en todos los navegadores que cumplan con los estándares, se deberán agregar formas alternativas para que el CSS supere las diferencias.

También puede haber otros problemas de visualización asociados con una declaración XML, aunque estos probablemente sólo lo sean para los navegadores mucho más antiguos. La especificación XHTML advierte que se procesen las instrucciones que se visualizan en algunos agentes de usuario. Además, algunos agentes de usuario interpretan la declaración XML para que signifique que el documento no es un XML reconocido, sino un HTML y, por lo tanto, no puede visualizar el documento como se esperaba. Se deberán hacer pruebas en agentes de usuario apropiados para decidir si esto será un problema para usted.

Evidentemente, como se mencionó antes, si se usa UTF-8 o UTF-16, se puede omitir la declaración XML y el archivo seguirá funcionando como XML o HTML. Esta es probablemente la solución más simple.

Uso de UTF-16

De acuerdo con los resultados de una muestra de Google de varios miles de millones de páginas en 2010, menos del 0.01% de las páginas web se codificaron en UTF-16. La mayor parte del tiempo será mejor que se elija UTF-8 como decodificador (el cual a través de la misma encuesta contó para más del 50% de todas las páginas web). Una razón para esto es que existen reglas especiales para declarar la codificación de una página UTF-16.

En este artículo, generalmente recomendamos declarar la codificación dentro del documento, aun cuando se declara en el encabezado HTTP. Por otra parte, la especificación HTML5 prohíbe actualmente el uso del atributo metacharset o la directiva del programa para declarar UTF-16. Existe discrepancia entre lo que es necesario y las cosas que se pueden cambiar. Por el momento, si desea que valide su código HTML5, no deberá usar declaraciones de elementos para contenido codificado UTF-16.

Ya sea que se usen declaraciones basadas en elementos o no, deberá asegurar que siempre tenga una marca de orden de bytes al inicio de un archivo codificado UTF-16. En efecto, esta es la declaración del documento.

Más aún, si la página se codifica como UTF-16, no hay que declarar el archivo para que sea "UTF-16BE" o "UTF-16LE"; use "UTF-16" solamente. La marca de orden de bytes al comienzo del archivo indicará si el esquema de codificación es little-endian o big-endian. (Esto se debe a que el contenido explícitamente codificado, por ejemplo, UTF-16BE, no deberá usar una orden de marca de bytes; pero el HTML5 requiere de una orden de marca de bytes para páginas codificadas UTF-16).

El atributo charset en un enlace

La especificación HTML 4.01 describe que un atributo charset puede agregarse al enlace a y a los elementos del sistema de escritura, y se supone que indica la codificación del documento al que se realiza el enlace.

Esto se puede usar en un elemento de enlace integrado como este:

Consulte nuestras<a href="/mysite/mydoc.html" charset="ISO-8859-1">listas de publicaciones</a>.

También puede usarlo de esta forma para indicar la codificación de una hoja de estilo CSS.

<link rel="stylesheet" charset="Windows-1251" href="mystyles.css" type="text/css">

La idea es que el navegador sea capaz de aplicar la codificación correcta al documento que recupera si no hay una codificación específica para el documento de ninguna otra forma.

El uso de este atributo en un elemento a o de enlace está actualmente desaprobado por la especificación HTML5, por lo que deberá evitar usarla en dichos elementos.

Además, existen algunas cosas para considerar antes de usar este atributo. En primer lugar, no es bien admitido por la mayoría de los navegadores. En segundo lugar, es difícil asegurar que la información sea correcta en todo momento. El autor del documento señalado puede cambiar la codificación del documento sin que usted lo sepa. Si el autor aún no ha especificado la codificación de su documento, deberá solicitar al navegador que aplique una codificación incorrecta. Y, por último, no sería necesario si las personas siguieran las pautas de este tutorial y etiquetaran sus documentos apropiadamente. Ese es un enfoque mucho mejor.

Esta forma de indicar la codificación de un documento tiene la precedencia más baja (es decir, si la codificación se declara de otra forma, esto será ignorado). Esto significa que tampoco puede usarlo para corregir las declaraciones incorrectas.

Reglas de precedencia

En caso de haber conflicto entre declaraciones múltiples de codificación, las reglas de precedencia aplican para determinar qué declaración prevalece. Para XHTML y HTML, la precedencia es como se indica a continuación, siendo 1 lo más alto.

  1. Encabezado Content-Type de HTTP
  2. marca de orden de bytes (BOM)
  3. declaración XML
  4. metaelemento
  5. atributo de enlace charset

La elevada precedencia del encabezado HTTP es útil, como se mencionó antes, en situaciones donde la codificación del documento es cambiada por un servidor intermediario, ya que tal "transcodificación" es probable que no cambie en las declaraciones del documento. El servidor de transcodificación deberá declarar la nueva codificación en el encabezado HTTP.

La especificación HTML5 (la cual no es aún estable) describe formalmente la precedencia para la marca de orden de bytes (BOM). De acuerdo con la especificación, el BOM tiene menor precedencia que un encabezado HTTP Content-Type, pero mayor precedencia que cualquier otra cosa. En el momento de la escritura, esto no se implementó de forma consistente en las últimas versiones de la mayoría de los navegadores. Para obtener más información, consulte los resultados de las pruebas.

Dinos qué piensas (en Inglés).

Suscripción a feed RSS.

Nuevos recursos

Noticias de la página de inicio

Twitter (Noticias de la página de inicio)

‎@webi18n

Lecturas complementarias

De: Richard Ishida, W3C. Traductor: Spanish Translation Services by Trusted Translations, Inc..

XHTML 1.0 válido
CSS válido
Codificado en UTF-8

Traducido del inglés con fecha 2010-09-09. Traducción modificada por última vez el 2011-08-17 14:52 GMT.

Para ver el historial de cambios del documento, busque qa-html-encoding-declarations en la bitácora de internacionalización.