Articulo de referencia

UTF-32

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 y que...

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 y que utiliza exactamente 32 bits (cuatro bytes ) por punto de código (pero un número de bits iniciales deben ser cero, ya que hay muchos menos de 2³² puntos de código Unicode, necesitando en realidad solo 21 bits). [ 1 ] En contraste, 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 enésimo punto de código en una secuencia de puntos de código es una operación de tiempo constante . En cambio, 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 sencillo en el código que utiliza enteros que se incrementan en uno para examinar cada posición en una cadena , como se hacía comúnmente con ASCII . Los programadores novatos a menudo sobreestiman enormemente la utilidad de esto. [ 2 ]

La principal desventaja de UTF-32 es su ineficiencia en cuanto al uso del espacio, ya que utiliza cuatro bytes por punto de código, incluyendo 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, pueden ignorarse para las estimaciones de tamaño. Esto hace que UTF-32 sea casi el doble de grande que UTF-16 . Puede llegar a ser hasta cuatro veces más grande que UTF-8, dependiendo de cuántos caracteres pertenezcan al subconjunto ASCII . [ 3 ]

Historia

El estándar original ISO/IEC 10646 define una codificación de 32 bits denominada UCS-4 , en la que cada punto de código del Conjunto Universal de Caracteres (UCS) se representa mediante un valor de 31 bits entre 0 y 0x7FFFFFFF (el bit de signo no se utilizaba y era cero). En noviembre de 2003, Unicode se vio restringido por el RFC  3629 para ajustarse a las limitaciones de la codificación UTF-16 : prohibiendo explícitamente los puntos de código superiores a U+10FFFF (y también los subrogados alto y bajo U+D800 a U+DFFF). Este subconjunto limitado define UTF-32. [ 4 ] [ 1 ] Aunque el estándar ISO tenía (a partir de 1998 en Unicode 2.1) "reservado para uso privado" de 0xE00000 a 0xFFFFFF y de 0x60000000 a 0x7FFFFFFF [ 5 ] estas áreas se eliminaron en versiones posteriores. Debido a que el documento Principios y Procedimientos del Grupo de Trabajo 2 del JTC 1/SC 2 de ISO/IEC establece que todas las asignaciones futuras de puntos de código estarán restringidas al rango Unicode, UTF-32 podrá representar todos los puntos de código UCS y UTF-32 y UCS-4 son idénticos. [ 6 ]

Utilidad de 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 práctica:

  • 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 examinando como máximo 2 a 4 unidades de código). [ a ]
  • Encontrar el N-ésimo "carácter" en una cadena. Encontrar el N-ésimo punto de código es un problema O(1) , mientras que es un problema O(n) en una codificación de ancho variable. Sin embargo, lo que un usuario podría llamar un "carácter" sigue siendo de ancho variable, [ 3 ] por ejemplo, la secuencia de caracteres combinatorios á son dos puntos de código, el emoji 👨‍🦲 son 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 son el doble de anchos, [ 2 ] además de los problemas ya mencionados con el número de puntos de código que no es igual al número de caracteres.

Usar

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

El uso de cadenas UTF-32 en Windows (donde wchar_t es de 16 bits) es prácticamente inexistente. En sistemas Unix, las aplicaciones a veces utilizan internamente cadenas UTF-32, aunque rara vez, debido a que el tipo wchar_t está definido como de 32 bits.

UTF-32 también está prohibido como codificación de caracteres HTML. [ 8 ] [ 9 ]

Lenguajes de programación

Las versiones de Python hasta la 3.2 se pueden compilar para usar cadenas UTF-32 en lugar de UTF-16 ; a partir de la versión 3.3, 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 que todos los puntos de código tengan ese tamaño. [ 10 ]

El lenguaje de programación Julia dejó de ofrecer soporte integrado para UTF-32 con su versión 1.0, simplificando el lenguaje para que solo admita cadenas UTF-8 (considerando todas las demás codificaciones como obsoletas y trasladadas de la biblioteca estándar a un paquete [ 11 ] ) siguiendo el "Manifiesto UTF-8 en todas partes". [ 12 ]

C++11 tiene dos tipos de datos integrados que usan UTF-32. El char32_ttipo de dato almacena un carácter en UTF-32. El u32stringtipo de dato 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. [ 13 ] [ 14 ]

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

C# tiene una UTF32Encodingclase que representa los caracteres Unicode como bytes, en lugar de como una cadena. [ 15 ]

Variantes

Aunque técnicamente inválidos, los caracteres sustitutos suelen codificarse y permitirse. Esto permite que los caracteres UTF-16 inválidos (como los nombres de archivo de Windows) se traduzcan a UTF-32, de forma similar a como funciona la variante WTF-8 de UTF-8. En ocasiones, se codifican caracteres sustitutos emparejados en lugar de caracteres que no son 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 caracteres UTF-8 inválidos utilizando valores que no son Unicode para codificar los errores de UTF-8, aunque no existe un estándar para ello.

UTF-32 tiene 2 versiones para big-endian y little-endian: UTF-32-BE y UTF-32-LE .

Véase también

Notas

  1. Para UTF-8: Seleccione el punto donde truncar. Si el byte anterior es 0-0x7F, o el byte posterior es 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 encontrar dicho punto y trunque allí. Si no se 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. 1 2 Constable, Peter (2001-06-13). "Mapeo de puntos de código a formas de codificación Unicode" . Computers and Writing Systems - SIL International . Recuperado el 2022-10-03 .
  2. 1 2 Goregaokar, Manish (14 de enero de 2017). "Dejemos de atribuir significado a los puntos de código" . En busca de la pereza . Recuperado el 14 de junio de 2020. La gente empieza a implicar 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.
  3. 1 2 "Preguntas frecuentes - UTF-8, UTF-16, UTF-32 y BOM" . Unicode . Consultado el 4 de septiembre de 2022 .
  4. "Estándares disponibles públicamente - ISO/IEC 10646:2020" . Estándares 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ódigos UCS] que consta de los 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".
  5. "Anexo B - El conjunto de caracteres universal (UCS)" . DKUUG Standardizing . Archivado del original el 22 de enero de 2022. Consultado el 3 de octubre de 2022 .
  6. "C.2 Formas de codificación en ISO/IEC 10646" (PDF) . El estándar Unicode, versión 6.0 . Mountain View, CA: Consorcio Unicode . Febrero de 2011. pág. 573. ISBN  978-1-936213-01-6. Ahora [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.
  7. "👨‍🦲 Hombre: Emoji calvo" . Emojipedia . Consultado el 12 de octubre de 2021 .
  8. "Estándar HTML" . html.spec.whatwg.org . Consultado el 11 de noviembre de 2024 .
  9. «Choisir et appliquer un encodage de caractères» . www.w3.org (en francés) . Consultado el 11 de noviembre de 2024 .
  10. Löwis, Martin. "PEP 393 -- Representación flexible de cadenas" . python.org . Python . Consultado el 26 de octubre de 2014 .
  11. JuliaStrings/LegacyStrings.jl: Tipos de cadena Unicode heredados , JuliaStrings, 17/05/2019 , consultado el 15/10/2019
  12. "UTF-8 en todas partes" . utf8everywhere.org .
  13. "u32string" . cplusplus.com . Consultado el 12 de noviembre de 2024 .
  14. "Cadena literal - cppreference.com" . en.cppreference.com . Consultado el 14 de noviembre de 2024 .
  15. dotnet-bot. "Clase UTF32Encoding (System.Text)" . learn.microsoft.com . Consultado el 27/11/2024 .
  • El estándar Unicode 5.0.0, capítulo 3 , define formalmente UTF-32 en el § 3.9, D90 (página 40 del PDF) y en el § 3.10, D99-D101 (página 45 del PDF).  
  • Anexo n.º 19 del estándar Unicode : define formalmente UTF-32 para Unicode 3.x (marzo de 2001; última actualización: 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).