stringtranslate.com

Codificación de caracteres en HTML

Si bien el lenguaje de marcado de hipertexto ( HTML ) se utiliza desde 1991, HTML 4.0, de diciembre de 1997, fue la primera versión estandarizada en la que se dio un tratamiento razonablemente completo a los caracteres internacionales. Cuando un documento HTML incluye caracteres especiales fuera del rango de ASCII de siete bits , vale la pena considerar dos objetivos: la integridad de la información y la visualización universal en el navegador .

Especificación de la codificación de caracteres del documento

Hay dos formas generales de especificar qué codificación de caracteres se utiliza en el documento.

En primer lugar, el servidor web puede incluir la codificación de caracteres o " charset" en el encabezado del Protocolo de transferencia de hipertexto (HTTP) Content-Type, que normalmente se vería así: [1]

Tipo de contenido: texto/html; conjunto de caracteres=utf-8

Este método proporciona al servidor HTTP una forma conveniente de alterar la codificación del documento de acuerdo con la negociación del contenido ; cierto software de servidor HTTP puede hacerlo, por ejemplo Apache con el módulo mod_charset_lite . [2]

En segundo lugar, se puede incluir una declaración dentro del propio documento.

Para HTML es posible incluir esta información dentro del headelemento cerca de la parte superior del documento: [3]

< meta  http-equiv = "Tipo de contenido"  contenido = "texto/html; conjunto de caracteres=utf-8" >

HTML5 también permite que la siguiente sintaxis signifique exactamente lo mismo: [3]

< meta  charset = "utf-8" >

Los documentos XHTML tienen una tercera opción: expresar la codificación de caracteres mediante una declaración XML , de la siguiente manera: [4]

<?xml versión="1.0" codificación="utf-8"?>

Con este segundo enfoque, debido a que la codificación de caracteres no se puede conocer hasta que se analiza la declaración, existe un problema al saber qué codificación de caracteres se utiliza en el documento hasta la declaración misma inclusive. Si la codificación de caracteres es una extensión ASCII , entonces el contenido hasta la declaración misma inclusive debe ser ASCII puro y esto funcionará correctamente. Para las codificaciones de caracteres que no son extensiones ASCII (es decir, no un superconjunto de ASCII), como UTF-16BE y UTF-16LE , un procesador de HTML, como un navegador web, debe poder analizar la declaración en algunos casos mediante el uso de heurística.

Algoritmo de detección de codificación

A partir de HTML5, el conjunto de caracteres recomendado es UTF-8 . [3] En la especificación se define un "algoritmo de detección de codificación" para determinar la codificación de caracteres del documento en función de múltiples fuentes de entrada, entre las que se incluyen:

  1. Instrucciones explícitas para el usuario
  2. Una metaetiqueta explícita dentro de los primeros 1024 bytes del documento
  3. Una marca de orden de bytes (BOM) dentro de los primeros tres bytes del documento
  4. El tipo de contenido HTTP u otra información de la capa de transporte
  5. Análisis de los bytes del documento en busca de secuencias específicas o rangos de valores de bytes, [5] y otros mecanismos de detección tentativa.

Los caracteres que se encuentran fuera del rango ASCII imprimible (32 a 126) suelen aparecer de forma incorrecta. Esto presenta pocos problemas para los usuarios de habla inglesa , pero otros idiomas requieren con regularidad (en algunos casos, siempre) caracteres fuera de ese rango. En los entornos de los idiomas chino, japonés y coreano ( CJK ), donde se utilizan varias codificaciones multibyte diferentes, también se suele emplear la detección automática. Por último, los navegadores suelen permitir al usuario anular manualmente la etiqueta de conjunto de caracteres incorrecta .

Cada vez es más común que los sitios web multilingües y los sitios web en idiomas no occidentales utilicen UTF-8 , que permite el uso de la misma codificación para todos los idiomas. UTF-16 o UTF-32 , que también se pueden utilizar para todos los idiomas, se utilizan menos porque pueden ser más difíciles de manejar en lenguajes de programación que asumen una codificación de superconjunto ASCII orientada a bytes , y son menos eficientes para texto con una alta frecuencia de caracteres ASCII, que suele ser el caso de los documentos HTML.

La visualización exitosa de una página no es necesariamente una indicación de que su codificación esté especificada correctamente. Si tanto el creador como el lector de la página asumen una codificación de caracteres específica de la plataforma y el servidor no envía ninguna información de identificación, el lector verá la página de todos modos como el creador pretendía, pero otros lectores en plataformas diferentes o con idiomas nativos diferentes no verán la página como estaba previsto.

Codificaciones permitidas

El estándar de codificación WHATWG , al que hacen referencia los estándares HTML recientes (el actual WHATWG HTML Living Standard, así como los anteriormente competidores HTML 5.0 y 5.1 del W3C ) especifica una lista de codificaciones que los navegadores deben admitir. Los estándares HTML prohíben la compatibilidad con otras codificaciones. [6] [7] [8] El estándar de codificación estipula además que los nuevos formatos, los nuevos protocolos (incluso cuando se utilizan formatos existentes) y los autores de nuevos documentos deben utilizar exclusivamente UTF-8 . [9]

Además de UTF-8, las siguientes codificaciones están explícitamente enumeradas en el propio estándar HTML, con referencia al Estándar de codificación: [8]

  1. ^ También se especifica para TIS-620, ISO-8859-11y etiquetas relacionadas. [9]
  2. ^ También se especifica para ASCII, ISO-8859-1y etiquetas relacionadas. [9]
  3. ^ También se especifica para ISO-8859-9etiquetas relacionadas. [9]
  4. ^ Se especifica con 0xA3A0 como una codificación duplicada del espacio ideográfico (U+3000) por razones de compatibilidad y, por lo tanto, se excluye U+E5E5 (un carácter de uso privado). [10] [11] También se especifica con 0x80 aceptado como una codificación alternativa del símbolo del euro (U+20AC; consulte Windows-936 ). [12] De lo contrario, sigue las asignaciones del estándar de 2005. [11]
  5. ^ Variante del conjunto de caracteres suplementarios de Hong Kong , [13] aunque la mayoría de las extensiones HKSCS (aquellas con bytes iniciales menores que 0xA1) no están incluidas por el codificador, solo por el decodificador. [14]
  6. ^ La especificación incluye extensiones de IBM y NEC , [15] y es más precisamente Windows-31J . [13]
  7. ^ La especificación utiliza el mismo índice que el utilizado para Shift JIS (en la medida en que esté dentro del alcance), es decir, incluye extensiones NEC. El codificador convierte el kana de ancho medio en ancho completo, [16] pero el decodificador lo acepta utilizando una secuencia de escape (ESC 0x28 0x49). [17] Shift Out y Shift In (0x0E y 0x0F) se excluyen por completo para evitar ataques. [17] [18]
  8. ^ En realidad, el Código Hangul Unificado (Windows-949), que es un superconjunto que cubre todo el bloque de sílabas Hangul . [13] [19]
  9. ^ Especificado solo para decodificación; los envíos de formularios desde documentos codificados en UTF-16 deben codificarse en UTF-8 . [20]
  10. ^ Para compatibilidad con el contenido implementado, también se especifica para la UTF-16etiqueta simple, [21] aunque una marca de orden de bytes (BOM), si está presente, tiene prioridad sobre cualquier etiqueta. [22] Especificado solo para decodificación; los envíos de formularios de documentos codificados en UTF-16 deben codificarse en UTF-8 . [20]
  11. ^ Asigna los números 0x00 a 0x7F a U+0000 a U+007F, y los números 0x80 a 0xFF a U+F780 a U+F7FF (un rango de área de uso privado ), de modo que los 8 bits inferiores del punto de código siempre coincidan con el byte original. [23]

Las siguientes codificaciones adicionales están incluidas en el Estándar de codificación y, por lo tanto, también se requiere soporte para ellas: [9]

  1. ^ Utiliza el mismo codificador y decodificador que ISO-8859-8, pero no está sujeto al comportamiento de orden visual que se utiliza para los documentos etiquetados como ISO-8859-8. [24]
  2. ^ Titulado KOI8-U y especificado para ambas KOI8-Uetiquetas KOI8-RU; [9] sigue a KOI8-RU en las posiciones 0xAE y 0xBE (es decir, incluye Ў/ў ) [25] [26] pero KOI8-U en las posiciones 0x93–9F. [25]
  3. ^ También se especifica para GB2312etiquetas relacionadas. Se maneja de la misma manera que GB 18030 para fines de decodificación. [27] Para fines de codificación, el etiquetado como GBK (o GB 2312 ) excluye los códigos de cuatro bytes y favorece la representación 0x80 de un byte para U+20AC. [10]
  4. ^ La especificación utiliza el mismo índice que el utilizado para Shift JIS (en la medida en que se encuentre dentro del alcance del conjunto de códigos EUC 1), es decir, incluye extensiones NEC. JIS X 0212 se incluye solo para decodificación. [28]

Las siguientes codificaciones se enumeran como ejemplos explícitos de codificaciones prohibidas: [8]

El estándar también define un decodificador de "reemplazo", que asigna todo el contenido etiquetado como ciertas codificaciones al carácter de reemplazo (�), negándose a procesarlo en absoluto. Esto tiene como objetivo evitar ataques (por ejemplo, secuencias de comandos entre sitios ) que pueden explotar una diferencia entre el cliente y el servidor en cuanto a qué codificaciones se admiten para enmascarar contenido malicioso. [29] Aunque la misma preocupación de seguridad se aplica a ISO-2022-JP y UTF-16 , que también permiten que las secuencias de bytes ASCII se interpreten de manera diferente, este enfoque no se consideró factible para ellos, ya que se utilizan comparativamente con mayor frecuencia en el contenido implementado. [30] Las siguientes codificaciones reciben este tratamiento: [31]

Referencias de personajes

Además de las codificaciones de caracteres nativas, los caracteres también se pueden codificar como referencias de caracteres , que pueden ser referencias de caracteres numéricos ( decimales o hexadecimales ) o referencias de entidades de caracteres . Las referencias de entidades de caracteres también se denominan a veces entidades con nombre o entidades HTML para HTML. El uso de referencias de caracteres en HTML se deriva de SGML .

Referencias de caracteres HTML

Una referencia de carácter numérico en HTML se refiere a un carácter por su conjunto de caracteres universales / punto de código Unicode y utiliza el formato

&#nnnn;

o

&#xhhhh;

donde nnnn es el punto de código en formato decimal y hhhh es el punto de código en formato hexadecimal . La x debe estar en minúscula en los documentos XML. nnnn o hhhh pueden ser cualquier número de dígitos y pueden incluir ceros a la izquierda. hhhh puede mezclar mayúsculas y minúsculas, aunque las mayúsculas son el estilo habitual.

No todos los navegadores web o clientes de correo electrónico utilizados por los receptores de documentos HTML, o editores de texto utilizados por los autores de documentos HTML, podrán reproducir todos los caracteres HTML. La mayoría del software moderno puede mostrar la mayoría o todos los caracteres del idioma del usuario y dibujará un cuadro u otro indicador claro para los caracteres que no pueda reproducir.

Para los códigos de 0 a 127, el conjunto estándar ASCII original de 7 bits , la mayoría de estos caracteres se pueden utilizar sin una referencia de carácter. Los códigos de 160 a 255 se pueden crear utilizando nombres de entidad de carácter . Solo se pueden crear unos pocos códigos de números superiores utilizando nombres de entidad, pero todos se pueden crear mediante una referencia de carácter de número decimal.

Las referencias a entidades de caracteres también pueden tener el formato donde el nombre es una cadena alfanumérica que distingue entre mayúsculas y minúsculas. Por ejemplo, "λ" también se puede codificar como en un documento HTML. Las referencias a entidades de caracteres , , y están predefinidas en HTML y SGML, porque , , y ya se utilizan para delimitar el marcado. Esto no incluía la entidad (') de XML anterior a HTML5 . Para obtener una lista de todas las referencias a entidades de caracteres HTML con nombre junto con las versiones en las que se introdujeron, consulte Lista de referencias a entidades de caracteres XML y HTML .&name;&lambda;&lt;&gt;&quot;&amp;<>"&&apos;

El uso innecesario de referencias de caracteres HTML puede reducir significativamente la legibilidad del HTML. Si la codificación de caracteres para una página web se elige adecuadamente, las referencias de caracteres HTML generalmente solo se requieren para los caracteres que delimitan el marcado, como se mencionó anteriormente, y para algunos caracteres especiales (o ninguno en absoluto si se usa una codificación Unicode nativa como UTF-8 ). El escape incorrecto de entidades HTML también puede abrir vulnerabilidades de seguridad para ataques de inyección como cross-site scripting . Si los atributos HTML se dejan sin comillas, ciertos caracteres, sobre todo los espacios en blanco , como el espacio y la tabulación, deben escaparse utilizando entidades. Otros lenguajes relacionados con HTML tienen sus propios métodos de escape de caracteres.

Referencias de caracteres XML

A diferencia del HTML tradicional, con su amplia gama de referencias a entidades de caracteres, en XML solo hay cinco referencias a entidades de caracteres predefinidas. Estas se utilizan para escapar caracteres que son sensibles al marcado en ciertos contextos: [32]

Todas las demás referencias a entidades de caracteres deben definirse antes de poder usarse. Por ejemplo, el uso de &eacute;(que da como resultado é, E minúscula latina con acento agudo, U+00E9 en Unicode) en un documento XML generará un error a menos que la entidad ya haya sido definida. XML también requiere que las xreferencias numéricas hexadecimales estén en minúsculas: por ejemplo &#xA1ben lugar de &#XA1b. XHTML , que es una aplicación XML, admite el conjunto de entidades HTML, junto con las entidades predefinidas de XML.

Véase también

Referencias

  1. ^ Fielding, R.; Reschke, J. (junio de 2014), "Content-Type", en Fielding, R.; Reschke, J (eds.), Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content , IETF , doi :10.17487/RFC7231, S2CID  14399078 , consultado el 30 de julio de 2014
  2. ^ "Módulo Apache mod_charset_lite".
  3. ^ abc "Especificación de la codificación de caracteres del documento", HTML5 , World Wide Web Consortium , 14 de diciembre de 2017 , consultado el 28 de mayo de 2018
  4. ^ Bray, T. ; Paoli, J. ; Sperberg-McQueen, C. ; Maler, E. ; Yergeau, F. (26 de noviembre de 2008), "Prolog and Document Type Statement", XML , W3C , consultado el 8 de marzo de 2010
  5. ^ "HTML5 escanea previamente un flujo de bytes para determinar su codificación".
  6. ^ "8.2.2.3. Codificaciones de caracteres". Estándar HTML 5.1 . W3C.
  7. ^ "8.2.2.3. Codificaciones de caracteres". Estándar HTML 5. W3C.
  8. ^ abc "12.2.3.3 Codificaciones de caracteres". HTML Living Standard . WHATWG.
  9. ^ abcdef van Kesteren, Anne . "4.2: Nombres y etiquetas". Estándar de codificación . QUÉ WG .
  10. ^ ab van Kesteren, Anne . "Codificador 10.2.2. gb18030". Estándar de codificación . QUÉ WG .
  11. ^ ab van Kesteren, Anne . "5. Índices (§ índice gb18030)". Estándar de codificación . QUÉ WG .
  12. ^ van Kesteren, Ana . "10.2.1. Decodificador gb18030". Estándar de codificación . QUÉ WG .
  13. ^ abc Mozilla Foundation . "Diferencias notables con respecto a la nomenclatura de IANA". Crate encoding_rs . docs.rs.
  14. ^ van Kesteren, Ana . "5. Índices (§ índice puntero Big5)". Estándar de codificación . QUÉ WG .
  15. ^ van Kesteren, Ana . "5. Índices (§ Índice jis0208)". Estándar de codificación . QUÉ WG .
  16. ^ van Kesteren, Ana . "5. Índices (§ Índice ISO-2022-JP katakana)". Estándar de codificación . QUÉ WG .
  17. ^ ab van Kesteren, Anne . "12.2.1. Decodificador ISO-2022-JP". Estándar de codificación . QUÉ WG .
  18. ^ van Kesteren, Ana . "12.2.2. Codificador ISO-2022-JP". Estándar de codificación . QUÉ WG .
  19. ^ van Kesteren, Ana . "5. Índices (§ índice EUC-KR)". Estándar de codificación . QUÉ WG .
  20. ^ ab van Kesteren, Anne . "4.3. Codificaciones de salida". Estándar de codificación . QUÉ WG .
  21. ^ van Kesteren, Ana . "14.4.UTF-16LE". Estándar de codificación . QUÉ WG .
  22. ^ van Kesteren, Ana . "6. Ganchos para estándares (§ decodificar)". Estándar de codificación . QUÉ WG .
  23. ^ van Kesteren, Ana . "14.5. x definido por el usuario". Estándar de codificación . QUÉ WG .
  24. ^ van Kesteren, Ana . "9. Codificaciones heredadas de un solo byte (§ Nota)". Estándar de codificación . QUÉ WG .
  25. ^ ab van Kesteren, Anne . "visualización del índice KOI8-U". Estándar de codificación . QUÉ WG .
  26. ^ "Error 17053: Compatibilidad con el mapeo KOI8-RU para KOI8-U". W3C Bugzilla . 19 de agosto de 2015.
  27. ^ van Kesteren, Ana . "10.1. GBK". Estándar de codificación . QUÉ WG .
  28. ^ van Kesteren, Ana . "5. Índices (§ Índice jis0212)". Estándar de codificación . QUÉ WG .
  29. ^ van Kesteren, Ana . "14.1: sustitución". Estándar de codificación . QUÉ WG .
  30. ^ van Kesteren, Ana . "2: Antecedentes de seguridad". Estándar de codificación . QUÉ WG .
  31. ^ van Kesteren, Ana . "4.2: Nombres y etiquetas (§ sustitución)". Estándar de codificación . QUÉ WG .
  32. ^ Bray, T. ; Paoli, J. ; Sperberg-McQueen, C. ; Maler, E. ; Yergeau, F. (26 de noviembre de 2008), "Character and Entity References", XML , W3C , consultado el 8 de marzo de 2010

Enlaces externos