Unicode, Unicode Big Endian o UTF-8? ¿Cuál es la diferencia? ¿Qué formato es mejor?

19

Cuando intento guardar un archivo de texto con texto que no está en inglés en el Bloc de notas, tengo la opción de elegir entre Unicode , Unicode Big Endian y UTF-8 . ¿Cuál es la diferencia entre estos formatos?

Suponiendo que no quiero ninguna compatibilidad con versiones anteriores (con versiones o aplicaciones de SO anteriores) y no me importa el tamaño del archivo, ¿cuál de estos formatos es mejor?

(Suponga que el texto puede estar en idiomas como chino o japonés, además de otros idiomas).

Nota: De las respuestas y comentarios a continuación parece que en la jerga del Bloc de notas, Unicode es UTF-16 (Little Endian), Unicode Big Endian es UTF-16 (Big Endian) y UTF-8 está bien UTF-8.

Ashwin Nanjappa
fuente

Respuestas:

19

No sé. ¿Qué es mejor: una sierra o un martillo? :-)

Unicode no es UTF

Sin embargo, hay un poco en el artículo que es un poco más relevante para el tema en cuestión:

  • UTF-8 se enfoca en minimizar el tamaño de bytes para la representación de caracteres del conjunto ASCII (representación de longitud variable: cada carácter se representa en 1 a 4 bytes, y los caracteres ASCII se ajustan a 1 byte). Como dice Joel:

"¡Miren todos esos ceros!", Dijeron, ya que eran estadounidenses y estaban mirando textos en inglés que rara vez usaban puntos de código por encima de U + 00FF. También eran hippies liberales en California que querían conservar (burlarse). Si fueran tejanos, no les hubiera importado consumir el doble de bytes. Pero esos débiles californianos no podían soportar la idea de duplicar la cantidad de almacenamiento que se necesitaba para las cadenas.

  • UTF-32 se centra en la exhaustividad y la representación de longitud fija, utilizando 4 bytes para todos los caracteres. Es la traducción más sencilla, asigna directamente el punto de código Unicode a 4 bytes. Obviamente, no es muy eficiente en tamaño.

  • UTF-16 es un compromiso, que usa 2 bytes la mayor parte del tiempo, pero se expande a 2 * 2 bytes por carácter para representar ciertos caracteres, aquellos que no están incluidos en el Plano Multilingüe Básico (BMP).

Consulte también El mínimo absoluto que todo desarrollador de software debe saber absolutamente, positivamente sobre los conjuntos de caracteres y Unicode (¡sin excusas!)

Jason Baker
fuente
44
El problema proviene del hecho de que Unicode es una 'codificación', pero no en el sentido de números en bytes. UTF-8/16/32 son todas codificaciones Unicode, pero Unicode en sí es un mapeo de símbolos a números. Creo que podrían haber usado una terminología más única para evitar esta confusión.
jerryjvl
44
Sin embargo, independientemente del OP de la pregunta, es probable que la aplicación signifique 'UTF-16' donde dice 'Unicode'.
jerryjvl
3
No estoy seguro de que el objetivo de UTF-8 sea la "conservación" en lugar de la compatibilidad con ASCII.
Mr. Shiny and New 安 宇
@Johannes: El Consorcio Unicode ha decidido nunca asignar puntos de código por encima de U + 10FFFF porque no pueden representarse en UTF-16. Esto tuvo el efecto de restringir UTF-8 a 4 bytes.
user46971
1
"Unicode no es UTF" - para muchos, es WTF;)
mlvljr
4

Para los idiomas europeos, UTF-8 es más pequeño. Para las lenguas orientales, la diferencia no es tan clara.

Ambos manejarán todos los posibles caracteres Unicode, por lo que no debería haber diferencia en la compatibilidad.

Mark Ransom
fuente
3

Hay más codificaciones de caracteres Unicode de lo que piensas.

  • UTF 8

    La codificación UTF-8 es de ancho variable, que varía de 1 a 4 bytes, con los bits superiores de cada byte reservados como bits de control. Los bits iniciales del primer byte indican el número total de bytes utilizados para ese carácter. El valor escalar del punto de código de un personaje es la concatenación de los bits sin control. En esta tabla, xrepresenta los 8 bits más bajos del valor Unicode, yrepresenta los siguientes 8 bits más altos y zrepresenta los bits más altos que eso.

    Unicode              Byte1     Byte2     Byte3     Byte4
    U+0000-U+007F       0xxxxxxx            
    U+0080-U+07FF       110yyyxx  10xxxxxx          
    U+0800-U+FFFF       1110yyyy  10yyyyxx  10xxxxxx    
    U+10000-U+10FFFF    11110zzz  10zzyyyy  10yyyyxx  10xxxxxx
    
  • UCS-16
  • UCS-16BE
  • UCS-16LE

  • UTF-16
  • UTF-16BE
  • UTF-16LE

  • UTF-32
  • UTF-32-BE
Brad Gilbert
fuente
1
Hay más codificaciones de caracteres Unicode de las que enumeró. Por ejemplo, UTF-1 , UTF-7 , UTF-EBCDIC , GB-18030 , MIME , UTF-9 y UTF-18 ... También puede usar cualquier esquema de codificación binaria para codificar datos Unicode. Leer más Comparación de codificaciones Unicode
phuclv
1

"Unicode" es otro término para "UTF-16", que es una codificación del conjunto de caracteres Unicode en dieciséis bits por carácter. UTF-8 lo codifica en ocho bits por carácter.

En ambos casos, cualquier desbordamiento se asigna a otros 16 u ocho bits.

John Saunders
fuente
¿Cuál es mejor entonces?
R. Martinho Fernandes
"Depende de la situación.
John Saunders
Aunque para esta pregunta específica parece que "Unicode" es ABUSADO como otro término para "UTF-16", no es así en general, vea la respuesta de Jason.
Arjan
1
Quiere decir "por unidad de código", no "por carácter"; tanto UTF-8 como UTF-16 pueden usar múltiples unidades de código para representar un personaje. Y "Unicode" y "UTF-16" NO son lo mismo, excepto en la terminología de Microsoft.
user46971
1

La única ventaja real con archivos pequeños como archivos de texto es el tamaño del archivo resultante. UTF-8 generalmente produce archivos más pequeños. Pero esta diferencia puede ser menos pronunciada con el texto chino / japonés.

zildjohn01
fuente
Tenga en cuenta que también hay una diferencia en el ancho de banda de la red y el uso de la memoria.
Jason Baker
1
"UTF-8 generalmente produce archivos más pequeños": generalmente no. UTF-8 produce archivos más pequeños para archivos ASCII. Si un archivo solo consta de puntos de código Unicode por encima de U + 0800, será más grande en UTF-8 que en UTF-16.
sleske
0

En una palabra, Unicode es un conjunto de caracteres , mientras que Unicode Big Endian y utf-8 son dos codificaciones , que se utilizan para almacenar caracteres como 01 en una computadora.

Thuzhf
fuente
¿Y la diferencia es ...?
David Richerby