stringtranslate.com

UTF-32

UTF-32 ( formato de transformación Unicode de 32 bits ) 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 una cantidad de bits iniciales debe ser cero, ya que hay muchos menos). (más de 2 32 puntos de código Unicode, que en realidad sólo necesitan 21 bits). [1] UTF-32 es una codificación de longitud fija, a diferencia de todos los demás formatos de transformación Unicode, que 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 del código Unicode se indexan directamente. Encontrar el enésimo punto de código 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 inicio de la cadena. Esto hace que UTF-32 sea un reemplazo simple en el código que utiliza números enteros que se incrementan en uno para examinar cada ubicación en una cadena , como se hacía comúnmente con ASCII . Sin embargo, los puntos de código Unicode rara vez se procesan de forma completamente aislada, como en la combinación de secuencias de caracteres y emoji. [2]

La principal desventaja de UTF-32 es que ocupa poco espacio y 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, textos con algunos emojis populares) y, por lo general, pueden ignorarse para las estimaciones de tamaño. Esto hace que UTF-32 sea casi el doble de tamaño que UTF-16 . Puede tener hasta cuatro veces el tamaño de UTF-8 dependiendo de cuántos caracteres haya en el subconjunto ASCII . [2]

Historia

El estándar ISO/IEC 10646 original 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 utilizó). y 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 puntos de código mayores que U+10FFFF (y también los sustitutos alto y bajo 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) "reservado para uso privado" 0xE00000 a 0xFFFFFF y 0x60000000 a 0x7FFFFFFF [4], estas áreas se eliminaron en versiones posteriores. Debido a que el documento de Principios y Procedimientos del Grupo de Trabajo 2 ISO/IEC JTC 1/SC 2 establece que todas las asignaciones futuras de puntos de código se limitarán al rango Unicode, UTF-32 podrá representar todos los puntos de código UCS y UTF-32. y UCS-4 son idénticos.

Utilidad de ancho fijo

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

Usar

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

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 a veces, pero rara vez, se utilizan internamente por las aplicaciones, debido a que el tipo wchar_t se define como 32 bits. Se pueden compilar versiones de Python hasta 3.2 para usarlas en lugar de UTF-16 ; desde la versión 3.3 en adelante, todas las cadenas Unicode se almacenan en UTF-32 pero con los ceros bytes iniciales optimizados "dependiendo del [punto de código] con el ordinal Unicode más grande (1, 2 o 4 bytes)" para que todos los puntos de código tengan ese tamaño. . [9] Los lenguajes de programación Seed7 [10] y Lasso [ cita necesaria ] codifican todas las cadenas con UTF-32, en la creencia de que la indexación directa es importante, mientras que el lenguaje de programación Julia se alejó del soporte integrado UTF-32 con su versión 1.0. simplificar el lenguaje para tener solo cadenas UTF-8 (con todas las demás codificaciones consideradas heredadas y sacadas de la biblioteca estándar para empaquetar [11] ) siguiendo el "Manifiesto UTF-8 Everywhere". [12]

Variantes

Aunque técnicamente no son válidas, las mitades sustitutas a menudo están codificadas y permitidas. Esto permite traducir UTF-16 no válidos (como nombres de archivos de Windows) 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 son BMP, similar a CESU-8 . Debido a la gran cantidad de valores de 32 bits no utilizados, también es posible preservar UTF-8 no válido utilizando valores que no sean Unicode para codificar errores UTF-8, aunque no existe un estándar para esto.

Ver también


Notas

  1. ^ Para UTF-8: seleccione el punto en el que truncarse. Si el byte anterior es 0-0x7F, o el byte posterior es cualquier otro que no sean 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 trunquelo en ese punto. Si no se encuentra, trunca en la posición original. Esto funciona incluso si hay errores de codificación en UTF-8. UTF-16 es trivial y sólo tiene que respaldar una palabra como máximo.

Referencias

  1. ^ ab Constable, Peter (13 de junio de 2001). "Asignación de puntos de código a formularios de codificación Unicode". Computadoras y Sistemas de Escritura - SIL Internacional . Consultado el 3 de octubre de 2022 .
  2. ^ ab "Preguntas frecuentes: UTF-8, UTF-16, UTF-32 y BOM". Unicódigo . 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 sustituto 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] formado por números enteros del 0 al 10 FFFF (hexadecimal)". Cláusula 4.58: "[valor escalar UCS] cualquier punto de código UCS excepto los puntos de código sustituto alto y sustituto bajo".
  4. ^ "Anexo B: el conjunto de caracteres universales (UCS)". DKUUG Estandarización . Archivado desde el original el 22 de enero de 2022 . Consultado el 3 de octubre de 2022 .
  5. ^ ab Goregaokar, Manish (14 de enero de 2017). "Dejemos de atribuir significado a los puntos del 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(1) o el corte en los límites de los puntos de código es una operación útil.
  6. ^ "👨‍🦲 Hombre: Emoji calvo". Emojipedia . Consultado el 12 de octubre de 2021 .
  7. ^ "👩‍🦰 Mujer: Emoji de pelo rojo". Emojipedia . Consultado el 12 de octubre de 2021 .
  8. ^ "↔️ Secuencias Emoji ZWJ (Unidor de ancho cero)". emojipedia.org . Consultado el 12 de octubre de 2021 .
  9. ^ Lowis, Martín. "PEP 393 - Representación de cadenas flexibles". python.org . Pitón . Consultado el 26 de octubre de 2014 .
  10. ^ "El uso de UTF-32 tiene varias ventajas".
  11. ^ JuliaStrings/LegacyStrings.jl: tipos de cadenas Unicode heredadas, JuliaStrings, 2019-05-17 , consultado el 15 de octubre de 2019
  12. ^ "Manifiesto UTF-8 en todas partes".

enlaces externos