stringtranslate.com

Codificaciones 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 los caracteres internacionales recibieron un tratamiento razonablemente completo. 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 del 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.

Primero, 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; juego de caracteres = utf-8

Este método proporciona al servidor HTTP una manera conveniente de alterar la codificación del documento según 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; charset=utf-8" >

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

< meta  juego de caracteres = "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 para 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 incluida debe ser ASCII puro y esto funcionará correctamente. Para 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, debería poder analizar la declaración en algunos casos a través del uso de heurísticas.

Algoritmo de detección de codificación

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

  1. Instrucción de usuario explícita
  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 tentativos de detección.

Los caracteres fuera del rango ASCII imprimible (32 a 126) suelen aparecer incorrectamente. Esto presenta pocos problemas para los usuarios de habla inglesa , pero otros idiomas requieren regularmente (en algunos casos, siempre) caracteres fuera de ese rango. En entornos de idiomas chino, japonés y coreano ( CJK ), donde se utilizan varias codificaciones multibyte diferentes, también se suele emplear la detección automática. Finalmente, los navegadores generalmente también permiten al usuario anular manualmente la etiqueta del juego de caracteres incorrecto .

Es cada vez 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 usar para todos los lenguajes, se usan 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 alguna codificación de caracteres específica de la plataforma y el servidor no envía ninguna información de identificación, entonces el lector verá la página como pretendía el creador, pero otros lectores en diferentes plataformas o con diferentes idiomas nativos. no verá 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 antiguos competidores W3C HTML 5.0 y 5.1) especifica una lista de codificaciones que los navegadores deben admitir. Los estándares HTML prohíben el soporte de 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 UTF-8 exclusivamente. [9]

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

  1. ^ También se especifica para TIS-620y ISO-8859-11etiquetas relacionadas. [9]
  2. ^ También se especifica para ASCIIy ISO-8859-1etiquetas relacionadas. [9]
  3. ^ También se especifica para ISO-8859-9etiquetas relacionadas. [9]
  4. ^ Especificado con 0xA3A0 como codificación duplicada del espacio ideográfico (U+3000) por razones de compatibilidad y, como tal, excluye U+E5E5 (un carácter de uso privado). [10] [11] Además, se especifica con 0x80 aceptado como codificación alternativa del signo del euro (U+20AC; consulte Windows-936 ). [12] En caso contrario, se siguen las asignaciones de la norma de 2005. [11]
  5. ^ Variante del juego de caracteres suplementario de Hong Kong , [13] aunque la mayoría de las extensiones HKSCS (aquellas con bytes iniciales inferiores a 0xA1) no están incluidas en el codificador, solo en 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 se utiliza para Shift JIS (en la medida en que esté a su alcance), es decir, incluye extensiones NEC. El codificador convierte kana de ancho medio a ancho completo, [16] pero el decodificador lo acepta mediante 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. ^ Código Hangul realmente unificado (Windows-949), que es un superconjunto que cubre todo el bloque de sílabas Hangul . [13] [19]
  9. ^ Especificado únicamente para decodificación; Los envíos de formularios de documentos codificados en UTF-16 deben codificarse en UTF-8 . [20]
  10. ^ Por 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 sólo para decodificación; Los envíos de formularios de documentos codificados en UTF-16 deben codificarse en UTF-8 . [20]
  11. ^ Asigna 0x00 a 0x7F a U+0000 a U+007F, y 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 se enumeran en el estándar de codificación y, por lo tanto, también se requiere compatibilidad con 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 igual 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 se utiliza para Shift JIS (en la medida en que esté 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 las codificaciones admitidas 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 usan comparativamente con más frecuencia en sistemas desplegados. contenido. [30] Las siguientes codificaciones reciben este tratamiento: [31]

Referencias de caracteres

Además de las codificaciones de caracteres nativos, los caracteres también se pueden codificar como referencias de caracteres , que pueden ser referencias de caracteres numéricos ( decimal o hexadecimal ) o referencias de entidades de caracteres . Las referencias a entidades de caracteres también se denominan a veces entidades nombradas o entidades HTML para HTML. El uso de referencias de caracteres en HTML 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 forma decimal y hhhh es el punto de código en forma hexadecimal . La x debe estar en minúscula en documentos XML. nnnn o hhhh pueden tener cualquier número de dígitos y pueden incluir ceros a la izquierda . El hhhh puede mezclar mayúsculas y minúsculas, aunque el estilo habitual es el de mayúsculas.

No todos los navegadores web o clientes de correo electrónico utilizados por los receptores de documentos HTML, ni todos los editores de texto utilizados por los autores de documentos HTML, podrán representar todos los caracteres HTML. La mayoría del software moderno es capaz de 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 pueden representar.

Para los códigos del 0 al 127, el conjunto estándar ASCII de 7 bits original , la mayoría de estos caracteres se pueden utilizar sin una referencia de carácter. Todos los códigos del 160 al 255 se pueden crear utilizando nombres de entidades de caracteres . Sólo se pueden crear unos pocos códigos con números más altos utilizando nombres de entidades, pero todos se pueden crear mediante referencia de caracteres de números decimales.

Las referencias de entidades de caracteres también pueden tener el formato en el que 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. La entidad de carácter hace referencia a , y está predefinida en HTML y SGML, porque , y ya se utilizan para delimitar el marcado. En particular, esto no incluía la entidad XML (') anterior a HTML5 . Para obtener una lista de todas las referencias de entidades de caracteres HTML con nombre junto con las versiones en las que se introdujeron, consulte Lista de referencias de entidades de caracteres HTML y XML .&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, entonces 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 una entidad HTML también puede abrir vulnerabilidades de seguridad para ataques de inyección, como secuencias de comandos entre sitios . Si los atributos HTML se dejan sin comillas, ciertos caracteres, sobre todo los espacios en blanco , como el espacio y el tabulador, deben tener caracteres de escape mediante entidades. Otros lenguajes relacionados con HTML tienen sus propios métodos para escapar de caracteres.

Referencias de caracteres XML

A diferencia del HTML tradicional con su amplia gama de referencias de entidades de caracteres, en XML sólo hay cinco referencias de entidades de caracteres predefinidas. Se utilizan para escapar de 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 é, 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.

Ver también

Referencias

  1. ^ Campo, R.; Reschke, J. (junio de 2014), "Content-Type", en Fielding, R; Reschke, J (eds.), Protocolo de transferencia de hipertexto (HTTP/1.1): semántica y contenido , IETF , doi :10.17487/RFC7231, S2CID  14399078 , consultado el 30 de julio de 2014
  2. ^ "Módulo Apache mod_charset_lite".
  3. ^ abc "Especificar 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), "Prólogo y declaración de tipo de documento", 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". Estándar de vida HTML . QUÉ.
  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. ^ Fundación abc Mozilla . "Diferencias notables con los nombres de la IANA". Caja encoding_rs . docs.rs.
  14. ^ van Kesteren, Ana . "5. Índices (§ puntero del índice 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: admite 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), "Referencias de caracteres y entidades", XML , W3C , consultado el 8 de marzo de 2010

enlaces externos