# UTF-16

UTF-16, que significa en ISO/IEC 10646:2003 “UCS Transformation Format for 16 Planes of Group 00”, es una forma de codificación de caracteres UCS y Unicode utilizando símbolos de longitud variable. Está oficialmente definida en el Anexo C de la norma ISO/IEC 10646:2003. También está descrita en el Estándar Unicode (versión 3.0 o superior), al igual que en la RFC 2781 de la IETF.
Sus características principales son:
* Es capaz de representar cualquier carácter Unicode.
* Utiliza símbolos de longitud variable: 1 o 2 palabras de 16 bits por carácter Unicode (2 o 4 bytes). La unidad de información es la palabra de 16 bits.
* Está optimizado para representar caracteres del plano básico multilingüe (BMP) y caracteres del rango U+0000 a U+FFFF. El BMP contiene la gran mayoría de caracteres y sistemas de escritura en uso en la actualidad. Cuando se limita al plano básico multilingüe, UTF-16 puede ser considerado una forma de codificación con símbolos de tamaño fijo (16 bits).
* No superposición: Los símbolos de 1 palabra (16 bits) utilizan un subconjunto de valores que no puede utilizarse en símbolos de 2 palabras (32 bits).

## Historia

UTF-16 es la evolución de UCS-2, presente en el estándar Unicode hasta la versión 1.1. En UCS-2 cada punto de código se representa por su valor, lo que limitaba su uso al plano básico multilingüe. En la versión 2.0 del Estándar Unicode, la decisión de ampliar el espacio de códigos por encima del código FFFF supuso la necesidad de incluir un nuevo formato que diese soporte a los nuevos planos, 15 y 16, de uso privado. Sin embargo, el estándar no definió todavía ningún punto de código haciendo uso de este mecanismo hasta la versión 3.1.

## Descripción

En UTF-16 cada punto de código entre U+0000 y U+FFFF se codifica, sin cambios, utilizando 16 bits. Este rango se corresponde con el plano básico multilingüe de Unicode, por lo que la gran mayoría de los caracteres de uso común se codifican con 16 bits.
Los caracteres de los planos adicionales se codifican mediante 32 bits. La codificación no se hace de forma directa, es decir, el código final no es el valor del punto de código. UTF-16 define un formato de transformación para estos casos denominado pares subrogados.
A la hora de valorar el espacio de almacenamiento requerido por un texto utilizando esta codificación, puede asumirse que los caracteres no incluidos en el plano básico son muy poco frecuentes y por lo tanto cada carácter utilizará 16 bits. Esta afirmación es válida también para el caso de las escrituras CJK (chino, japonés y coreano).

### Pares subrogados

Unicode e ISO/IEC han limitado el espacio asignable a los códigos hasta 10FFFF, por lo que se requiere un máximo de 21 bits para la representación de cualquier carácter. Si se usan dos palabras para representar códigos por encima de FFFF, se tiene un exceso de bits. Aprovechando esta circunstancia, se diseñó el sistema de pares subrogados para representar caracteres fuera del plano básico.
Se define un par subrogado como dos palabras de 16 bits donde:
* La primera palabra de 16 bits se denomina subrogado alto o subrogado inicial en terminología Unicode o elementos RC de la zona media-alta en terminología ISO/IEC. Toman valores en el rango [D800,DBFF].
* La segunda palabra de 16 bits se denomina subrogado bajo o subrogado final en terminología Unicode o elementos RC de la zona media-baja en terminología ISO/IEC. Toman valores en el rango [DC00,DFFF].
* Se cumple el principio de no superposición, los conjuntos valores de subrogados altos, bajos y códigos no subrogados son completamente disjuntos.
Para poder cumplir el principio de no superposición, el conjunto de valores utilizados como pares subrogados ha sido estandarizado y reservado, por lo que no puede ser utilizado para otros fines.
El sistema de pares subrogados se añadió en la versión 2.0 de Unicode, ISO 10646:xxxx, y por su diseño minimiza los conflictos que se pudieran presentar con implementaciones anteriores que no hagan uso de ellos.

### Errores de codificación

Las normas de codificación establecen, por lo tanto, límites a las cadenas que se pueden formar. Según la norma, un intérprete de cadenas debe rechazar como inválidas, y no tratar de interpretar, las cadenas mal formadas.
* Un código subrogado inicial siempre debe ir seguido de un código subrogado final.
* Un código subrogado final siempre debe ir precedido por un código subrogado inicial.
* No se admite la codificación de caracteres inválidos. Los puntos de código U+FFFE, U+FFFF, y el rango U+FDD0 a U+FDEF son puntos de códigos especiales que no representan caracteres y no deben codificarse en UTF-16. Tampoco se admiten los valores reservados fuera del plano básico.

### Esquemas de codificación y BOM

A partir del formato de transformación UTF-16 se definen 3 esquemas de codificación. A pesar de que comparten nombres, no debe confundirse esquemas y formas de codificación. Los esquemas de codificación tratan de la forma en que se serializa la información codificada. La seguridad en los intercambios de información entre sistemas heterogéneos requiere la implementación de sistemas que permitan determinar el orden correcto de los bits y bytes y garantizar que la reconstrucción de la información es correcta. Una diferencia fundamental entre procesadores es el orden de disposición de los bytes en palabras de 16 y 32 bits, lo que se denomina endianness. Los esquemas de codificación deben garantizar que los extremos de una comunicación saben cómo interpretar la información recibida.
| Esquema de codificación | Endianness | Admite BOM |
| UTF-16 | Big-endian o Little-endian | Sí |
| UTF-16BE | Big-endian | No |
| UTF-16LE | Little-endian | No |
Unicode define una marca especial, Byte order mark o BOM (Marca de orden de bytes), al inicio de un fichero o una comunicación para hacer explícita la ordenación de bytes. Esta marca es el carácter con punto de código U+FEFF. Cuando se encuentra en una posición inicial, puede ser interpretado como BOM dependiendo del contexto de la comunicación. En cualquier otra posición mantiene su semántica original como carácter ZERO WIDTH NON-BREAKING SPACE. Cuando un protocolo superior especifica el orden de bytes, la marca no es necesaria y puede omitirse, dando lugar a los esquemas de la lista anterior con sufijo BE o LE. En el caso del esquema UTF-16, que admite BOM, si este no se especifica se asume que la ordenación de bytes es big-endian.