UTF-32

Codificación de caracteres Unicode como 4 bytes por punto de código

UTF-32 ( formato de transformación Unicode de 32 bits ), a veces llamado UCS-4, es una codificación de longitud fija que se utiliza para codificar puntos de código Unicode que utiliza exactamente 32 bits (cuatro bytes ) por punto de código (pero un número de bits iniciales debe ser cero ya que hay muchos menos de 2 32 puntos de código Unicode, necesitando en realidad solo 21 bits). [1] Por el contrario, todos los demás formatos de transformación Unicode son codificaciones de longitud variable. Cada valor de 32 bits en UTF-32 representa un punto de código Unicode y es exactamente igual al valor numérico de ese punto de código.

La principal ventaja de UTF-32 es que los puntos de código Unicode se indexan directamente. Encontrar el punto de código N en una secuencia de puntos de código es una operación de tiempo constante . Por el contrario, un código de longitud variable requiere tiempo lineal para contar N puntos de código desde el comienzo de la cadena. Esto hace que UTF-32 sea un reemplazo simple en el código que usa números enteros que se incrementan en uno para examinar cada ubicación en una cadena , como se hacía comúnmente para ASCII . Sin embargo, los puntos de código Unicode rara vez se procesan de forma completamente aislada, como al combinar secuencias de caracteres y para emojis. [2]

La principal desventaja de UTF-32 es que no es eficiente en cuanto al espacio, ya que utiliza cuatro bytes por punto de código, incluidos 11 bits que siempre son cero. Los caracteres más allá del BMP son relativamente raros en la mayoría de los textos (excepto, por ejemplo, en el caso de textos con algunos emojis populares) y, por lo general, se pueden ignorar para las estimaciones de tamaño. Esto hace que UTF-32 sea casi el doble del tamaño de UTF-16 . Puede ser hasta cuatro veces el tamaño de UTF-8 según la cantidad de caracteres que haya en el subconjunto ASCII . [2]

Historia

El estándar original ISO/IEC 10646 define una forma de codificación de 32 bits llamada UCS-4 , en la que cada punto de código en el Conjunto de caracteres universal (UCS) está representado por un valor de 31 bits de 0 a 0x7FFFFFFF (el bit de signo no se usaba y era cero). En noviembre de 2003, Unicode fue restringido por RFC 3629 para que coincidiera con las restricciones de la codificación UTF-16 : prohibiendo explícitamente los puntos de código mayores que U+10FFFF (y también los sustitutos altos y bajos U+D800 a U+DFFF). Este subconjunto limitado define UTF-32. [3] [1] Aunque el estándar ISO tenía (a partir de 1998 en Unicode 2.1) "reservados para uso privado" 0xE00000 a 0xFFFFFF, y 0x60000000 a 0x7FFFFFFF [4] estas áreas se eliminaron en versiones posteriores. Dado que el documento Principios y procedimientos del Grupo de trabajo 2 del ISO/IEC JTC 1/SC 2 establece que todas las asignaciones futuras de puntos de código estarán limitadas al rango Unicode, UTF-32 podrá representar todos los puntos de código UCS y UTF-32 y UCS-4 son idénticos. [5]

Utilidad del ancho fijo

Un número fijo de bytes por punto de código tiene ventajas teóricas, pero cada una de ellas presenta problemas en la realidad:

  • El truncamiento se vuelve más fácil, pero no significativamente en comparación con UTF-8 y UTF-16 (ambos pueden buscar hacia atrás el punto a truncar observando 2 a 4 unidades de código como máximo). [a] [ cita requerida ]
  • Encontrar el carácter N en una cadena. Para un ancho fijo, esto es simplemente un problema O(1) , mientras que es un problema O(n) en una codificación de ancho variable. Los programadores novatos a menudo sobreestiman enormemente lo útil que es esto. [6] Además, lo que un usuario podría llamar un "carácter" sigue siendo de ancho variable, por ejemplo, la secuencia de caracteres de combinación á podría ser 2 puntos de código, el emoji 👨‍🦲 es tres, [7] y la ligadura es uno.
  • Conocer rápidamente el "ancho" de una cadena. Sin embargo, incluso las fuentes de "ancho fijo" tienen un ancho variable; a menudo, los ideogramas CJK tienen el doble de ancho, [6] además de los problemas ya mencionados con la cantidad de puntos de código que no es igual a la cantidad de caracteres.

Usar

El uso principal de UTF-32 es en API internas donde los datos son puntos de código individuales o glifos , en lugar de cadenas de caracteres. Por ejemplo, en la representación de texto moderna, es común [ cita requerida ] que el último paso sea construir una lista de estructuras que contengan coordenadas (x, y) , atributos y un único punto de código UTF-32 que identifique el glifo que se dibujará. A menudo, la información que no es Unicode se almacena en los 11 bits "sin usar" de cada palabra. [ cita requerida ]

El uso de cadenas UTF-32 en Windows (donde wchar_t es de 16 bits) es casi inexistente. En los sistemas Unix, las cadenas UTF-32 se utilizan a veces, pero raramente, de forma interna en las aplicaciones, debido a que el tipo wchar_t se define como de 32 bits.

Lenguajes de programación

Las versiones de Python hasta la 3.2 se pueden compilar para utilizarlas en lugar de UTF-16 ; desde la versión 3.3 en adelante, las cadenas Unicode se almacenan en UTF-32 si hay al menos 1 carácter que no sea BMP en la cadena, pero con los bytes cero iniciales optimizados "dependiendo del [punto de código] con el ordinal Unicode más grande (1, 2 o 4 bytes)" para hacer que todos los puntos de código tengan ese tamaño. [8]

Los lenguajes de programación Seed7 [9] y Lasso [ cita requerida ] codifican todas las cadenas con UTF-32, creyendo que la indexación directa es importante, mientras que el lenguaje de programación Julia se alejó del soporte UTF-32 integrado con su versión 1.0, simplificando el lenguaje para tener solo cadenas UTF-8 (con todas las demás codificaciones consideradas heredadas y movidas fuera de la biblioteca estándar al paquete [10] ) siguiendo el "Manifiesto UTF-8 Everywhere". [11]

En C++11 , hay 2 tipos de datos que utilizan UTF-32. El char32_ttipo de datos almacena 1 carácter en UTF-32. El u32stringtipo de datos almacena una cadena de caracteres codificados en UTF-32. Un carácter o literal de cadena codificado en UTF-32 se marca con Uantes del carácter o literal de cadena. [12] [13]

#include <string> char32_t Carácter UTF32 = U '🔟' ; // también escrito como U'\U0001F51F' std :: u32string UTF32_string = U "Cadena codificada en UTF–32" ; // definido como `const char32_t*´          

Variantes

Aunque técnicamente no son válidas, las mitades sustitutas suelen estar codificadas y permitidas. Esto permite que los UTF-16 no válidos (como los nombres de archivos de Windows) se traduzcan a UTF-32, de forma similar a cómo funciona la variante WTF-8 de UTF-8. A veces, se codifican sustitutos emparejados en lugar de caracteres que no sean BMP, de forma similar a CESU-8 . Debido a la gran cantidad de valores de 32 bits sin usar, también es posible preservar los UTF-8 no válidos mediante el uso de valores que no sean Unicode para codificar errores UTF-8, aunque no existe un estándar para esto.

Véase también

Notas

  1. ^ Para UTF-8: seleccione el punto en el que se truncará. Si el byte anterior es 0-0x7F, o el byte posterior es cualquier otro distinto de los bytes de continuación 0x80-0xBF, la cadena se puede truncar en ese punto. De lo contrario, busque hasta 3 bytes hacia atrás para ese punto y trunque en ese punto. Si no lo encuentra, trunque en la posición original. Esto funciona incluso si hay errores de codificación en UTF-8. UTF-16 es trivial y solo tiene que retroceder una palabra como máximo.

Referencias

  1. ^ ab Constable, Peter (13 de junio de 2001). "Mapeo de puntos de código a formas de codificación Unicode". Computadoras y sistemas de escritura - SIL International . Consultado el 3 de octubre de 2022 .
  2. ^ ab "Preguntas frecuentes: UTF-8, UTF-16, UTF-32 y BOM". Unicode . Consultado el 4 de septiembre de 2022 .
  3. ^ "Estándares disponibles públicamente - ISO/IEC 10646:2020". Normas ISO . Consultado el 12 de octubre de 2021 . Cláusula 9.4: "Debido a que los puntos de código sustitutos no son valores escalares UCS, las unidades de código UTF-32 en el rango 0000 D800-0000 DFFF están mal formadas". Cláusula 4.57: "[Espacio de código UCS] que consta de los números enteros de 0 a 10 FFFF (hexadecimal)". Cláusula 4.58: "[Valor escalar UCS] cualquier punto de código UCS excepto los puntos de código sustitutos altos y bajos".
  4. ^ "Anexo B - El conjunto de caracteres universales (UCS)". Estandarización de DKUUG . Archivado desde el original el 22 de enero de 2022. Consultado el 3 de octubre de 2022 .
  5. ^ "C.2 Formas de codificación en ISO/IEC 10646" (PDF) . El estándar Unicode, versión 6.0 . Mountain View, CA: Unicode Consortium . Febrero de 2011. p. 573. ISBN 978-1-936213-01-6Ahora [UCS-4] se trata simplemente como un sinónimo de UTF-32 y se considera la forma canónica para la representación de caracteres en 10646.
  6. ^ ab Goregaokar, Manish (14 de enero de 2017). "Dejemos de atribuir significado a los puntos de código". En busca de la pereza . Consultado el 14 de junio de 2020. La gente empieza a dar a entender que los puntos de código significan algo y que la indexación o segmentación O(1) en los límites de los puntos de código es una operación útil.
  7. ^ "👨‍🦲 Hombre: Emoji calvo". Emojipedia . Consultado el 12 de octubre de 2021 .
  8. ^ Löwis, Martin. «PEP 393 – Representación flexible de cadenas». python.org . Python . Consultado el 26 de octubre de 2014 .
  9. ^ "El uso de UTF-32 tiene varias ventajas".
  10. ^ JuliaStrings/LegacyStrings.jl: Tipos de cadenas Unicode heredadas, JuliaStrings, 2019-05-17 , consultado el 2019-10-15
  11. ^ "Manifiesto UTF-8 en todas partes".
  12. ^ "u32string". cplusplus.com . Consultado el 12 de noviembre de 2024 .
  13. ^ "Literal de cadena - cppreference.com". es.cppreference.com . Consultado el 14 de noviembre de 2024 .
  • El estándar Unicode 5.0.0, capítulo 3, define formalmente UTF-32 en § 3.9, D90 (PDF página 40) y § 3.10, D99-D101 (PDF página 45)
  • Anexo n.° 19 del estándar Unicode: definición formal de UTF-32 para Unicode 3.x (marzo de 2001; última actualización en marzo de 2002)
  • Registro de nuevos conjuntos de caracteres: UTF-32, UTF-32BE, UTF-32LE: anuncio de la incorporación de UTF-32 al registro de conjuntos de caracteres de la IANA (abril de 2002)
Obtenido de "https://es.wikipedia.org/w/index.php?title=UTF-32&oldid=1257487244"