UTF-16 ( Unicode Transformation Format ) en informática es una de las formas de codificar caracteres de Unicode como una secuencia de palabras de 16 bits .
Esta codificación le permite escribir caracteres Unicode en los rangos U+0000..U+D7FF y U+E000..U+10FFFF (número total 1 112 064 ). En este caso, cada carácter se escribe en una o dos palabras (un par sustituto). La codificación UTF-16 se describe en el Apéndice Q del estándar internacional ISO/IEC 10646 y también se cubre en IETF RFC 2781 "UTF-16, una codificación de ISO 10646".
La primera versión de Unicode (1991) era una codificación de ancho fijo de 16 bits; el número total de caracteres diferentes fue de 2 16 ( 65 536 ). En la segunda versión de Unicode (1996), se decidió ampliar significativamente el área de códigos; para mantener la compatibilidad con aquellos sistemas donde ya se implementó Unicode de 16 bits y se creó UTF-16. El área 0xD800-0xDFFF, reservada para parejas sustitutas, anteriormente pertenecía al área de "caracteres para uso privado".
Dado que se pueden mostrar 2 20 +2 16 −2048 ( 1 112 064 ) caracteres en UTF-16 , este número se eligió como el nuevo valor del espacio de código Unicode.
DC00 | … | DFFE | DFF | |
---|---|---|---|---|
D800 | 010000 | … | 0103FE | 0103FF |
D801 | 010400 | … | 0107FE | 0107FF |
… | … | |||
DBFF | 10FC00 | … | 10FFFE |
En UTF-16, los caracteres se codifican como palabras de doble byte utilizando todos los rangos de valores posibles (de 0 a FFFF 16 ). Es posible codificar caracteres Unicode en los rangos 0000 16 ..D7FF 16 y E000 16 ..FFFF 16 . El rango D800 16 ..DFFF 16 excluido aquí se usa solo para codificar los llamados pares sustitutos, caracteres que se codifican con dos palabras de 16 bits.
Los caracteres Unicode hasta FFFF 16 inclusive (excluyendo el rango de sustitutos) se escriben tal cual con una palabra de 16 bits.
Los caracteres en el rango 10000 16 ..10FFFF 16 (más de 16 bits) se codifican según el siguiente esquema:
Un único carácter UTF-16 se representa mediante una secuencia de dos bytes o dos pares de bytes. Cuál de los dos bytes viene primero, alto o bajo, depende del endianness . Un sistema compatible con procesadores x86 se denomina little endian , mientras que aquellos con procesadores m68k y SPARC se denominan big endian .
La marca de orden de bytes se utiliza para determinar el orden de los bytes . Al principio del texto se escribe el código U+FEFF. Al leer, si se consideró U+FFFE en lugar de U+FEFF, entonces el orden de los bytes se invierte (little endian), ya que el código U+FFFE en Unicode no codifica un carácter y se reserva solo para determinar el byte. ordenar. Debido a que UTF-8 no usa los valores 0xFE y 0xFF, puede usar la marca de orden de bytes como característica para distinguir entre UTF-16 y UTF-8.
También es posible especificar el orden de los bytes externamente; para ello, la codificación debe describirse como UTF-16LE o UTF-16BE (little-endian/big-endian), y no solo UTF-16. En este caso, la marca de orden de bytes (U+FEFF) no es necesaria.
En la API de Win32 , común en las versiones modernas del sistema operativo Microsoft Windows , hay dos formas de representar el texto: en forma de páginas de códigos tradicionales de 8 bits y en forma de UTF-16.
Cuando se usa UTF-16, Windows no impone restricciones en las codificaciones de archivos de texto para las aplicaciones, lo que les permite usar tanto UTF-16LE como UTF-16BE configurando e interpretando la marca de orden de bytes adecuada . Sin embargo, el formato interno de Windows siempre es UTF-16LE. Este punto debe tenerse en cuenta cuando se trabaja con archivos ejecutables que utilizan versiones Unicode de funciones WinAPI. Las cadenas en ellos siempre están codificadas en UTF-16LE [1] .
En los sistemas de archivos NTFS , además de FAT con soporte para nombres largos, los nombres de archivos también se escriben en UTF-16LE.
Los ejemplos a continuación están escritos en pseudocódigo y no tienen en cuenta la máscara de orden de bytes; solo muestran la esencia de la codificación. Orden de bytes: de menor a mayor (Little-Endian, Intel x86). El tipo Word es una palabra de dos bytes (entero sin signo de 16 bits) y el tipo UInt32 es un entero sin signo de 32 bits. Los valores hexadecimales comienzan con un signo de dólar "$".
En el ejemplo WriteWord() , un procedimiento condicional que escribe una palabra (mientras desplaza el puntero interno). La función LoWord()devuelve la palabra menos significativa de un entero de 32 bits (los bits más altos se descartan sin mirar).
// Valores de código válidos: $0000..$D7FF, $E000..$10FFFF. Procedimiento WriteUTF16Char ( Código : UInt32 ) If ( Código < $10000 ) Then WriteWord ( LoWord ( Code )) Else Code = Code - $10000 Var Lo10 : Word = LowWord ( Code And $3FF ) Var Hi10 : Word = LowWord ( Code Shr 10 ) WriteWord ( $D800 o Hi10 ) WriteWord ( $DC00 o Lo10 ) End If End ProcedimientoEl ejemplo ReadWord()lee una palabra de la secuencia (desplazando el puntero interno). También puede ajustar el orden de los bytes si es necesario. La función WordToUInt32expande una palabra de dos bytes a un entero sin signo de cuatro bytes, rellenando los bits altos con ceros. Error()interrumpe la ejecución (esencialmente una excepción ).
// Si tiene éxito, se devuelven valores // en los rangos $0000..$D7FF y $E000..$10FFFF. Función ReadUTF16Char : UInt32 Var Leading : Word // Leading (primera) palabra. Var Trailing : Palabra // Sigue (segunda) palabra. Interlineado = LeerPalabra () ; If ( Leading < $D800 ) O ( Leading > $DFFF ) Then Return WordToUInt32 ( Leading ) Else If ( Leading >= $DC00 ) Then Error ( " Secuencia de código no válida " ) . Else Var Code : UInt32 Code = WordToUInt32 ( Leading And $3FF ) Shl 10 Trailing = ReadWord () If (( Trailing < $DC00 ) Or ( Trailing > $DFFF )) Then Error ( " Secuencia de código no válida " ) Else Code = Code Or WordToUInt32 ( Trailing And $3FF ) Return ( Código + $10000 ) End If End If End FunciónCodificaciones de caracteres | |
---|---|
Codificaciones históricas | compensación adicional semáforo (Makarov) morse Bodo MTK-2 borrador 6 bits SCP RADIX-50 EBCDIC KOI-7 ISO 646 |
representación moderna de 8 bits | simbolos ASCII no ASCII páginas de códigos de 8 bits cirílico KOI-8 Codificación básica maccirílico ISO 8859 1 (lat.) 2 3 cuatro 5 (kir.) 6 7 ocho 9 diez once 12 13 catorce 15 (€) dieciséis ventanas 1250 1251 (Kir.) 1252 1253 1254 1255 1256 1257 1258 WGL4 IBM y DOS 437 850 852 855 866 "alternativa" MICRÓFONO |
Multibyte | tradicional DBCS GB2312 HTML unicode UTF-32 UTF-16 UTF-8 lista de personajes cirílico |
interfaz de usuario Diseño del teclado lugar traducción de línea fuente transcripción Fuentes personalizadas utilidades iconov registro |