Las páginas web creadas con el lenguaje de marcado de hipertexto ( HTML ) pueden contener texto multilingüe representado con el conjunto de caracteres universal Unicode. La clave de la relación entre Unicode y HTML reside en la relación entre el "conjunto de caracteres del documento", que define el conjunto de caracteres que pueden estar presentes en un documento HTML y les asigna números, y la "codificación de caracteres externa" o "charset", que se utiliza para codificar un documento determinado como una secuencia de bytes.
En el RFC 1866, el estándar inicial de HTML 2.0, el conjunto de caracteres del documento se definió como ISO-8859-1 (el estándar HTML posterior utiliza por defecto la codificación Windows-1252 ). El RFC 2070 lo amplió a ISO 10646 (que es básicamente equivalente a Unicode) . No varía entre documentos de diferentes idiomas o creados en diferentes plataformas. La codificación de caracteres externa la elige el autor del documento (o el software que utiliza para crearlo) y determina cómo se asignan los bytes utilizados para almacenar y/o transmitir el documento a los caracteres del conjunto de caracteres del documento. Los caracteres que no están presentes en la codificación de caracteres externa elegida pueden representarse mediante referencias a entidades de caracteres.
La relación entre Unicode y HTML suele ser un tema complejo para muchos profesionales de la informática, autores de documentos y usuarios web . La representación precisa del texto en páginas web , proveniente de diferentes idiomas y sistemas de escritura, se complica por los detalles de la codificación de caracteres , la sintaxis del lenguaje de marcado , las fuentes y los distintos niveles de compatibilidad de los navegadores web .
caracteres de documento HTML
Las páginas web suelen ser documentos HTML o XHTML . Ambos tipos de documentos constan, en un nivel fundamental, de caracteres , que son grafemas y unidades similares a grafemas, independientemente de cómo se manifiesten en los sistemas de almacenamiento y redes informáticas .
Un documento HTML es una secuencia de caracteres Unicode. Más específicamente, los documentos HTML 4.0 deben constar de caracteres del conjunto de caracteres HTML: un repertorio de caracteres en el que a cada carácter se le asigna un punto de código entero único y no negativo . Este conjunto se define en la DTD de HTML 4.0 , que también establece la sintaxis (secuencias de caracteres permitidas) para generar un documento HTML válido. El conjunto de caracteres HTML para HTML 4.0 incluye la mayoría, pero no todos, los caracteres definidos conjuntamente por Unicode e ISO/IEC 10646: el Conjunto Universal de Caracteres (UCS).
Al igual que los documentos HTML, un documento XHTML es una secuencia de caracteres Unicode. Sin embargo, un documento XHTML es un documento XML que, si bien no cuenta con una capa de abstracción explícita de "caracteres de documento" , se basa en una definición similar de caracteres permitidos que abarca la mayoría, aunque no todas, las definiciones de caracteres Unicode/UCS. Los conjuntos utilizados por HTML y XHTML/XML son ligeramente diferentes, pero estas diferencias tienen poca repercusión para el autor promedio de documentos.
Independientemente de si el documento es HTML o XHTML, al almacenarse en un sistema de archivos o transmitirse a través de una red, los caracteres del documento se codifican como una secuencia de octetos de bits ( bytes ) según una codificación de caracteres específica. Esta codificación puede ser un formato de transformación Unicode , como UTF-8 , que puede codificar directamente cualquier carácter Unicode, o una codificación heredada, como Windows-1252 , que no puede. Sin embargo, incluso al usar codificaciones que no admiten todos los caracteres Unicode, el documento codificado puede usar referencias numéricas de caracteres . Por ejemplo, (☺) se usa para indicar el carácter de cara sonriente en el conjunto de caracteres Unicode.☺
Codificación de caracteres
Para admitir todos los caracteres Unicode sin recurrir a referencias numéricas, una página web debe tener una codificación que abarque todo Unicode. La más popular es UTF-8 , donde los caracteres ASCII , como las letras inglesas, los dígitos y otros caracteres comunes, se conservan sin cambios con respecto a ASCII. Esto hace que el código HTML (como <br> y </div> ) no se vea afectado en comparación con ASCII. Los caracteres fuera del rango ASCII se almacenan en 2 a 4 bytes. También es posible usar UTF-16, donde la mayoría de los caracteres se almacenan como dos bytes con orden de bytes variable , que es compatible con los navegadores modernos pero menos común.
Referencias numéricas de caracteres
Para sortear las limitaciones de las codificaciones antiguas, HTML está diseñado para representar caracteres de todo el conjunto Unicode dentro de un documento HTML mediante una referencia numérica de caracteres : una secuencia de caracteres que especifica explícitamente el punto de código Unicode del carácter representado. Una referencia numérica de caracteres tiene la forma N , donde N es un número decimal que representa el punto de código Unicode o un número hexadecimal , en cuyo caso debe ir precedido de . Los caracteres que componen la referencia numérica de caracteres son universalmente representables en cualquier codificación aprobada para su uso en Internet.&#;x
La compatibilidad con el sistema hexadecimal en este contexto es más reciente, por lo que los navegadores antiguos podrían tener problemas para mostrar caracteres referenciados con números hexadecimales ; sin embargo, probablemente también tendrán problemas para mostrar caracteres Unicode por encima del punto de código 255. Para garantizar una mejor compatibilidad con navegadores antiguos, sigue siendo una práctica común convertir el punto de código hexadecimal a un valor decimal (por ejemplo, en lugar de ). 合合
Entidades de caracteres con nombre
En HTML 4, existe un conjunto estándar de 252 entidades de caracteres con nombre para caracteres —algunos comunes, otros menos conocidos— que no se encuentran en ciertas codificaciones de caracteres o que son sensibles al marcado en algunos contextos (por ejemplo, corchetes angulares y comillas). Si bien cualquier carácter Unicode puede referenciarse mediante su código numérico, algunos autores de documentos HTML prefieren usar estas entidades con nombre, siempre que sea posible, ya que son menos crípticas y contaban con mejor soporte en los primeros navegadores.
Las entidades de caracteres se pueden incluir en un documento HTML mediante el uso de referencias de entidades , que toman la forma NombreEntidad , donde NombreEntidad es el nombre de la entidad. Por ejemplo, , al igual que o , representa U+ 2014 : el carácter de guion largo " — " incluso si la codificación de caracteres utilizada no contiene ese carácter.&;———
Para ver la lista completa, consulte: Lista de referencias de entidades de caracteres XML y HTML .
Determinación de la codificación de caracteres
Para procesar correctamente el HTML, un navegador web debe determinar qué caracteres Unicode están representados por la codificación del documento. Para ello, el navegador debe conocer la codificación utilizada.
Codificación de información
Cuando un documento se transmite mediante un mensaje MIME o un transporte que utiliza tipos de contenido MIME, como una respuesta HTTPContent-Type: text/html; charset=UTF-8 , el mensaje puede indicar la codificación mediante un encabezado Content-Type, como . Se permiten otros medios externos para declarar la codificación, pero rara vez se utilizan. Si el documento utiliza una codificación Unicode , la información de codificación también puede estar presente en forma de una marca de orden de bytes (BOM). Finalmente, la codificación se puede declarar mediante la sintaxis HTML. Para la text/htmlserialización, siempre que la página esté codificada en una extensión de ASCII (como UTF-8 , y por lo tanto, no si la página utiliza UTF-16 ), se puede utilizar un metaelemento, como o (a partir de HTML5 ) . Para páginas HTML serializadas como XML, las opciones de declaración son confiar en la codificación predeterminada (que para documentos XML es UTF-8) o utilizar una declaración de codificación XML. El atributo meta no tiene ningún papel en HTML servido como XML.<meta http-equiv="content-type" content="text/html; charset=UTF-8"><meta charset="UTF-8">
Valores predeterminados de codificación
Se aplica una codificación predeterminada cuando no hay una declaración de codificación externa o interna ni una marca de orden de bytes. Si bien la codificación predeterminada para las páginas HTML servidas como XML debe ser UTF-8, la codificación predeterminada para una página web normal (es decir, para páginas HTML serializadas como text/html) varía según la localización del navegador. Para un sistema configurado principalmente para idiomas de Europa Occidental, generalmente será Windows-1252 . Para las localizaciones del alfabeto cirílico, la predeterminada suele ser Windows-1251 . Para un navegador de una ubicación donde prevalecen las codificaciones de caracteres multibyte heredadas , es probable que se aplique algún tipo de detección automática.
Tendencias de codificación
Debido a la herencia de las representaciones de texto de 8 bits en lenguajes de programación y sistemas operativos , y al deseo de evitar sobrecargar a los usuarios con la necesidad de comprender los matices de la codificación, muchos editores de texto utilizados por autores de HTML no pueden o no quieren ofrecer la opción de elegir la codificación al guardar archivos en el disco y, a menudo, ni siquiera permiten la entrada de caracteres fuera de un rango muy limitado. En consecuencia, muchos autores de HTML desconocen los problemas de codificación y pueden no tener idea de qué codificación utilizan realmente sus documentos. Los malentendidos, como la creencia de que la declaración de codificación afecta a un cambio en la codificación real (cuando en realidad es solo una etiqueta que podría ser inexacta), también son una razón para esta actitud de los editores. Otro factor que contribuye en la misma dirección es la llegada de UTF-8 , que disminuye enormemente la necesidad de otras codificaciones, por lo que los editores modernos tienden a usar UTF-8 por defecto, como recomienda la especificación HTML5, [ 1 ] UTF-8.
Detección de marcas de orden de bytes/Unicode
Para ambas serializaciones de HTML (content-type "text/html" y content/type "application/xhtml+xml"), la marca de orden de bytes (BOM) es una forma eficaz de transmitir información de codificación dentro de un documento HTML. Para UTF-8, la BOM es opcional, mientras que es obligatoria para las codificaciones UTF-16 y UTF-32. (Nota: UTF-16 y UTF-32 sin la BOM se conocen formalmente con nombres diferentes, son codificaciones diferentes y, por lo tanto, necesitan algún tipo de declaración de codificación; véase UTF-16BE , UTF-16LE , UTF-32LE y UTF-32BE ). El uso del carácter BOM (U+FEFF) significa que la codificación se declara automáticamente a cualquier aplicación de procesamiento. Las aplicaciones de procesamiento solo necesitan buscar un 0x0000FEFF, 0xFEFF o 0xEFBBBF inicial en el flujo de bytes para identificar el documento como codificado en UTF-32, UTF-16 o UTF-8, respectivamente. No se requieren mecanismos de metadatos adicionales para estas codificaciones, ya que la marca de orden de bytes incluye toda la información necesaria para las aplicaciones de procesamiento. En la mayoría de los casos, el carácter de marca de orden de bytes es manejado por las aplicaciones de edición por separado de los demás caracteres, por lo que hay poco riesgo de que un autor elimine o modifique la marca de orden de bytes para indicar una codificación incorrecta (como puede suceder cuando la codificación se declara en escritura inglesa/latina). Si el documento carece de una marca de orden de bytes, el hecho de que el primer carácter imprimible no en blanco en un documento HTML deba ser "<" (U+003C) puede usarse para determinar una codificación UTF-8/UTF-16/UTF-32.
Anulación de codificación
Muchos documentos HTML se sirven con información de codificación incorrecta o sin información de codificación alguna. Para determinar la codificación en estos casos, muchos navegadores permiten al usuario seleccionar manualmente un nombre de codificación de una lista. También pueden emplear un algoritmo de autodetección de codificación que funciona en conjunto con la selección manual o , en el caso de la marca de orden de bytes (BOM) y en el caso de HTML servido como XML , en contra de ella.
Para los documentos HTML serializados text/html, la anulación manual puede aplicarse a todos los documentos o solo a aquellos cuya codificación no se puede determinar a partir de las declaraciones o los patrones de bytes. El hecho de que la anulación manual exista y se utilice ampliamente dificulta la adopción de declaraciones de codificación precisas en la web; por lo tanto, es probable que el problema persista. Cabe señalar que Internet Explorer, Chrome y Safari , tanto para XML como para serializaciones , no permiten anular la codificación cuando la página incluye la marca de orden de bytes (BOM). [ 2 ] text/html
Para documentos HTML serializados con la etiqueta XML preferida – , no se permite la anulación manual de la codificación. Anular la codificación de un documento XML de este tipo implicaría que el documento dejara de ser XML, ya que es un error fatal para los documentos XML tener una declaración de codificación con errores detectables. Actualmente, los navegadores Gecko, como Firefox, cumplen con esta regla, mientras que la mayoría de los demás navegadores comunes que admiten HTML como XML, como los navegadores Webkit (Chrome/Safari) [ 3 ], permiten que la codificación de los documentos XHTML se anule manualmente. application/xhtml+xml
Compatibilidad con navegadores web
Muchos navegadores solo son capaces de mostrar un pequeño subconjunto del repertorio completo de Unicode. Así es como su navegador muestra los distintos puntos de código Unicode:
Algunos navegadores web, como Mozilla Firefox , Opera , Safari e Internet Explorer (a partir de la versión 7), pueden mostrar páginas web multilingües seleccionando de forma inteligente una fuente para cada carácter. Mostrarán correctamente cualquier combinación de bloques Unicode , siempre que el sistema operativo tenga las fuentes adecuadas .
Los navegadores antiguos, como Netscape Navigator 4.77 e Internet Explorer 6 , solo pueden mostrar texto compatible con la fuente actual asociada a la codificación de caracteres de la página, y pueden interpretar erróneamente las referencias numéricas de caracteres como referencias a valores de código dentro de la codificación de caracteres actual, en lugar de referencias a puntos de código Unicode. Al usar uno de estos navegadores, es poco probable que su computadora tenga todas esas fuentes, o que el navegador pueda usar todas las fuentes disponibles en la misma página. Como resultado, el navegador no mostrará correctamente el texto de los ejemplos anteriores, aunque puede mostrar un subconjunto de ellos. Sin embargo, dado que están codificados según el estándar, se mostrarán correctamente en cualquier sistema que cumpla con el estándar y tenga los caracteres disponibles. Además, es probable que los caracteres a los que se les asignan nombres para su uso en referencias de entidades nombradas estén más disponibles que otros.
Para mostrar caracteres que no pertenecen al Plano Multilingüe Básico , como la letra gótica faihu, que es una variante de la letra rúnica fehu de la tabla anterior, algunos sistemas (como Windows 2000) necesitan ajustes manuales en su configuración.
Frecuencia de uso
Según datos internos del índice web de Google , en diciembre de 2007 la codificación Unicode UTF-8 se convirtió en la más utilizada en las páginas web, superando a ASCII (EE. UU.) y 8859-1 / 1252 (Europa Occidental). [ 4 ]
Véase también
- Archivo de ayuda para el uso de caracteres especiales en Wikipedia
- Codificaciones de caracteres en HTML
- detección de conjuntos de caracteres
- Referencia de caracteres Unicode (wikilibros)
Referencias
- ↑ Ian Hickson (2011). "HTML5" . Recuperado el 17 de septiembre de 2011. Se recomienda a los autores que utilicen UTF-8 .
Los verificadores de conformidad pueden desaconsejar a los autores el uso de codificaciones antiguas. [RFC3629] Las herramientas de autoría deberían usar UTF-8 por defecto para los documentos recién creados. [RFC3629]
- ↑ "12897 – En algunos analizadores, el BOM de UTF-8 prevalece sobre el atributo de conjunto de caracteres HTTP (algoritmo de detección de codificación)" . www.w3.org . Consultado el 9 de marzo de 2023 .
- ↑ "66189 – El analizador XML no emite ERROR FATAL para todos los errores de codificación detectables" . bugs.webkit.org . Consultado el 9 de marzo de 2023 .
- ↑ "Transición a Unicode 5.1" . Blog oficial de Google . Consultado el 10 de octubre de 2024 .
Enlaces externos
- Unicode en XML y otros lenguajes de marcado : una publicación conjunta del W3C y el Consorcio Unicode que describe problemas y proporciona directrices relacionadas con Unicode en lenguajes de marcado.
- Definiciones de entidades de caracteres con nombre Latin-1 , "Especial" y Matemático, Griego y Simbólico para HTML 4.01
- UnicodeMap.org - Explora caracteres Unicode, rangos y otra información.
- Fuentes, editores y documentación gratuitos de SIL
- Recursos Unicode de Alan Wood : fuentes e información Unicode.
- http://www.phon.ucl.ac.uk/home/wells/ipa-unicode.htm Archivado el 2 de diciembre de 2007 en Wayback Machine El Alfabeto Fonético Internacional en Unicode
- http://www.alanwood.net/unicode/cjk_compatibility_ideographs.html Ideogramas de compatibilidad CJK
- http://www.unicode.org/charts/ Tablas de caracteres Unicode; solo números hexadecimales; archivos PDF que muestran todos los caracteres independientemente de las capacidades del navegador.
- Tabla de caracteres Unicode del 1 al 65535. Archivada el 3 de noviembre de 2007 en Wayback Machine : muestra cómo se ven en el navegador.
- Herramienta web que convierte caracteres "especiales" (como los caracteres chinos) en referencias numéricas de caracteres Unicode.
- Páginas web multilingües y Unicode : cómo solucionar problemas de visualización.
- w3.org vía web.archive.org - Referencia de cita HTML5 original guardada mediante Wayback Machine
- HTML
- Unicode