Creo que hay muchos buenos artículos sobre esto en la Web, pero aquí hay un breve resumen.
Tanto UTF-8 como UTF-16 son codificaciones de longitud variable. Sin embargo, en UTF-8 un carácter puede ocupar un mínimo de 8 bits, mientras que en UTF-16 la longitud del carácter comienza con 16 bits.
Principales profesionales de UTF-8:
- Los caracteres ASCII básicos como dígitos, caracteres latinos sin acentos, etc. ocupan un byte que es idéntico a la representación US-ASCII. De esta manera, todas las cadenas US-ASCII se convierten en UTF-8 válidas, lo que proporciona una buena compatibilidad con versiones anteriores en muchos casos.
- Sin bytes nulos, lo que permite utilizar cadenas terminadas en nulo, esto también introduce una gran cantidad de compatibilidad con versiones anteriores.
- UTF-8 es independiente del orden de bytes, por lo que no tiene que preocuparse por el problema Big Endian / Little Endian.
Principales contras UTF-8:
- Muchos caracteres comunes tienen una longitud diferente, lo que ralentiza la indexación por punto de código y el cálculo de un recuento de punto de código es terrible.
- Aunque el orden de bytes no importa, a veces UTF-8 todavía tiene BOM (marca de orden de bytes) que sirve para notificar que el texto está codificado en UTF-8, y también rompe la compatibilidad con el software ASCII incluso si el texto solo contiene caracteres ASCII . Al software de Microsoft (como el Bloc de notas) le gusta especialmente agregar BOM a UTF-8.
Principales profesionales de UTF-16:
- Caracteres BMP (plano multilingüe básico), incluidos el latín, el cirílico, la mayoría de los chinos (el PRC admitió algunos puntos de código fuera del BMP obligatorio), la mayoría de los japoneses se pueden representar con 2 bytes. Esto acelera la indexación y el cálculo del recuento de puntos de código en caso de que el texto no contenga caracteres suplementarios.
- Incluso si el texto tiene caracteres suplementarios, todavía están representados por pares de valores de 16 bits, lo que significa que la longitud total sigue siendo divisible por dos y permite usar 16 bits
char
como el componente primitivo de la cadena.
Principales contras UTF-16:
- Muchos bytes nulos en cadenas US-ASCII, lo que significa que no hay cadenas terminadas en nulo y mucha memoria desperdiciada.
- Usarlo como una codificación de longitud fija "funciona principalmente" en muchos escenarios comunes (especialmente en EE. UU. / UE / países con alfabetos cirílicos / Israel / países árabes / Irán y muchos otros), lo que a menudo conduce a un soporte roto donde no lo hace. ¡Esto significa que los programadores deben ser conscientes de los pares sustitutos y manejarlos adecuadamente en los casos en que sea importante!
- Es de longitud variable, por lo que contar o indexar puntos de código es costoso, aunque menor que UTF-8.
En general, UTF-16 suele ser mejor para la representación en memoria porque BE / LE es irrelevante allí (solo use el orden nativo) y la indexación es más rápida (simplemente no olvide manejar los pares sustitutos correctamente). UTF-8, por otro lado, es extremadamente bueno para archivos de texto y protocolos de red porque no hay problema BE / LE y la terminación nula a menudo es útil, así como la compatibilidad ASCII.