¿Diferencia entre UTF-8 y UTF-16? ¿Por qué necesitamos estos?
MessageDigest md = MessageDigest.getInstance("SHA-256");
String text = "This is some text";
md.update(text.getBytes("UTF-8")); // Change this to "UTF-16" if needed
byte[] digest = md.digest();
Respuestas:
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:
Principales contras UTF-8:
Principales profesionales de UTF-16:
char
como el componente primitivo de la cadena.Principales contras UTF-16:
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.
fuente
Son simplemente esquemas diferentes para representar caracteres Unicode.
Ambos son de longitud variable: UTF-16 utiliza 2 bytes para todos los caracteres en el plano multilingüe básico (BMP) que contiene la mayoría de los caracteres de uso común.
UTF-8 utiliza entre 1 y 3 bytes para los caracteres en el BMP, hasta 4 para los caracteres en el rango actual de Unicode de U + 0000 a U + 1FFFFF, y es extensible hasta U + 7FFFFFFF si alguna vez es necesario ... pero notablemente todos los caracteres ASCII están representados en un solo byte cada uno.
A los efectos de un resumen del mensaje, no importa cuál elija, siempre y cuando todos los que intenten recrear el resumen utilicen la misma opción.
Consulte esta página para obtener más información sobre UTF-8 y Unicode.
(Tenga en cuenta que todos los caracteres Java son puntos de código UTF-16 dentro del BMP; para representar caracteres por encima de U + FFFF, debe usar pares sustitutos en Java).
fuente
Seguridad: use solo UTF-8
Ha habido al menos un par de vulnerabilidades de seguridad en las implementaciones de UTF-16 . Ver Wikipedia para más detalles .
WHATWG y W3C ahora han declarado que solo UTF-8 debe usarse en la Web.
Otros grupos dicen lo mismo.
Entonces, aunque UTF-16 puede continuar siendo utilizado internamente por algunos sistemas como Java y Windows, el poco uso de UTF-16 que haya visto en el pasado para archivos de datos, intercambio de datos y demás, probablemente se desvanecerá por completo.
fuente
Esto no está relacionado con UTF-8/16 (en general, aunque se convierte a UTF16 y la parte BE / LE se puede configurar con una sola línea), pero a continuación se muestra la forma más rápida de convertir String a byte []. Por ejemplo: bueno exactamente para el caso proporcionado (código hash). String.getBytes (enc) es relativamente lento.
fuente
Una forma simple de diferenciar UTF-8 y UTF-16 es identificar elementos comunes entre ellos.
Además de compartir el mismo número Unicode para un personaje dado, cada uno tiene su propio formato.
fuente