Diferencia entre UTF-8 y UTF-16?


¿Diferencia entre UTF - 8 y UTF-16? ¿Por qué necesitamos esto?

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();
Author: Deduplicator, 2011-01-11

4 answers

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.

Principal UTF-8 pros:

  • Caracteres ASCII básicos como dígitos, caracteres latinos sin acentos, etc. ocupan un byte que es idéntico a NOSOTROS-representación ASCII. De esta manera todos nosotros-ASCII strings conviértase en UTF-8 válido, que proporciona compatibilidad con versiones anteriores decente en muchos casos.
  • No null bytes, que permite usar cadenas terminadas en null, esto introduce una gran cantidad de compatibilidad hacia atrás también.
  • UTF-8 es independiente del orden de bytes, por lo que no tiene que preocuparse por el problema de Big Endian / Little Endian.

Main UTF-8 contras:

  • 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 puntos de código terriblemente.
  • 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. El software de Microsoft (como el bloc de notas) le gusta especialmente agregar la lista de materiales a UTF-8.

Principal UTF-16 pros:

  • BMP (basic multilingual plane) caracteres, incluyendo latín, Cirílico, la mayoría de los chinos (el PRC hizo soporte para algunos puntos de código fuera de 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 contenga no 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.

Main UTF-16 contras:

  • Muchos bytes nulos en cadenas US-ASCII, lo que significa que no hay cadenas terminadas en null 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), a menudo conduce a un soporte roto donde no lo hace. Esto significa que los programadores tienen que ser conscientes de los pares sustitutos y manejarlos correctamente en los casos en que que importa!
  • Es de longitud variable, por lo que contar o indexar puntos de código es costoso, aunque menos que UTF-8.

En general, UTF-16 es generalmente 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, ya que así como ASCII-compatibilidad.

 266
Author: Sergei Tachenov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-19 05:23:55

Son simplemente diferentes esquemas para representar caracteres Unicode.

Ambos son de longitud variable-UTF - 16 usa 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 usa entre 1 y 3 bytes para los caracteres en el BMP, hasta 4 para los caracteres en el rango Unicode actual de U+0000 a U+1FFFFF, y es extensible hasta U+7FFFFFFF si es necesario... pero notablemente todos los caracteres ASCII son representado en un solo byte cada uno.

Para los propósitos de un resumen de mensaje, no importará cuál de estos elija, siempre y cuando todos los que intenten recrear el resumen usen la misma opción.

Vea esta página para 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 necesita usar pares sustitutos en Java.)

 18
Author: Jon Skeet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-14 15:27:03

Esto no está relacionado con UTF-8/16 (en general, aunque se convierte a UTF16 y la parte BE/LE se puede establecer con una sola línea), sin embargo, a continuación se muestra la forma más rápida de convertir Cadena a byte[]. Por ejemplo: bueno exactamente para el caso proporcionado (código hash). Cadena.getBytes (enc) es relativamente lento.

static byte[] toBytes(String s){
        byte[] b=new byte[s.length()*2];
        ByteBuffer.wrap(b).asCharBuffer().put(s);
        return b;
    }
 3
Author: bestsss,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-11 19:29:46

Una forma sencilla de diferenciar UTF-8 y UTF-16 es identificar puntos en común entre ellos.

Aparte de compartir el mismo número unicode para un carácter dado, cada uno es su propio formato.

 0
Author: Venkateswara Rao,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-27 04:59:46