¿Cuál es la diferencia entre UTF-8 y Unicode?

505

He escuchado opiniones contradictorias de personas, según la página Wikipedia UTF-8 .

Son lo mismo, ¿no? ¿Alguien puede aclarar?

culebra
fuente
1
Lo que este WIKI escribe sobre Unicode y los UTF está bien en mi opinión. Algunos comentarios al respecto son extraños: "Es posible en UTF-8 (o cualquier otra codificación de varios bytes) dividir o truncar una cadena en el medio de un carácter, lo que puede resultar en una cadena no válida". Por lo tanto, una cadena que obtiene la codificación UTF-8 ya no es una cadena sino una matriz de bytes o una secuencia de bytes. Los caracteres que componen la cadena se codifican. Por supuesto, también se puede decodificar. Ahora, por supuesto, puede cortar una secuencia utf-8 después del byte de inicio o después de un byte siguiente, pero ¿por qué alguien debería hacer esto?
brillante
Este artículo sobre los tipos de datos de cadena es educativo: mortoray.com/2013/11/27/the-string-type-is-broken : a veces, al trabajar con cadenas y sus componentes de nivel de byte, puede cortar inadvertidamente un carácter por la mitad .
Everett

Respuestas:

497

Para ampliar las respuestas que otros han dado:

Tenemos muchos idiomas con muchos caracteres que las computadoras deberían mostrar idealmente. Unicode asigna a cada carácter un número único o punto de código.

Las computadoras manejan números como bytes ... omitiendo un poco de historia aquí e ignorando los problemas de direccionamiento de memoria, las computadoras de 8 bits tratarían un byte de 8 bits como la unidad numérica más grande fácilmente representada en el hardware, las computadoras de 16 bits se expandirían eso a dos bytes, y así sucesivamente.

Las codificaciones de caracteres antiguos como ASCII son de la era (pre) de 8 bits, y tratan de incluir el idioma dominante en informática en ese momento, es decir, inglés, en números que van de 0 a 127 (7 bits). Con 26 letras en el alfabeto, tanto en mayúscula como en mayúscula, números y signos de puntuación, funcionó bastante bien. El ASCII se extendió un octavo bit para otros idiomas que no son inglés, pero los 128 números / puntos de código adicionales disponibles por esta expansión se asignarían a diferentes caracteres dependiendo del idioma que se muestre. Los estándares ISO-8859 son las formas más comunes de este mapeo; ISO-8859-1 e ISO-8859-15 (también conocido como ISO-Latin-1, latin1, y sí, también hay dos versiones diferentes del estándar ISO 8859).

Pero eso no es suficiente cuando desea representar caracteres de más de un idioma, por lo que agrupar todos los caracteres disponibles en un solo byte simplemente no funcionará.

Básicamente, existen dos tipos diferentes de codificaciones: una expande el rango de valores agregando más bits. Ejemplos de estas codificaciones serían UCS2 (2 bytes = 16 bits) y UCS4 (4 bytes = 32 bits). Sufren el mismo problema inherente que los estándares ASCII e ISO-8859, ya que su rango de valores sigue siendo limitado, incluso si el límite es mucho mayor.

El otro tipo de codificación utiliza un número variable de bytes por carácter, y las codificaciones más comúnmente conocidas para esto son las codificaciones UTF. Todas las codificaciones UTF funcionan aproximadamente de la misma manera: usted elige un tamaño de unidad, que para UTF-8 es de 8 bits, para UTF-16 es de 16 bits y para UTF-32 es de 32 bits. El estándar define algunos de estos bits como indicadores: si están configurados, la siguiente unidad en una secuencia de unidades se considerará parte del mismo carácter. Si no están configurados, esta unidad representa un personaje completamente. Por lo tanto, los caracteres más comunes (inglés) solo ocupan un byte en UTF-8 (dos en UTF-16, 4 en UTF-32), pero otros caracteres de idioma pueden ocupar seis bytes o más.

Las codificaciones de varios bytes (debería decir que son de varias unidades después de la explicación anterior) tienen la ventaja de que son relativamente eficientes en cuanto al espacio, pero la desventaja de que operaciones tales como encontrar subcadenas, comparaciones, etc., todas tienen que decodificar los caracteres en código unicode puntos antes de que se puedan realizar tales operaciones (aunque hay algunos atajos).

Tanto los estándares UCS como los estándares UTF codifican los puntos de código como se define en Unicode. En teoría, esas codificaciones podrían usarse para codificar cualquier número (dentro del rango que admite la codificación), pero, por supuesto, estas codificaciones se hicieron para codificar puntos de código Unicode. Y esa es tu relación entre ellos.

Windows maneja las llamadas cadenas "Unicode" como cadenas UTF-16, mientras que la mayoría de UNIX por defecto es UTF-8 en estos días. Los protocolos de comunicaciones como HTTP tienden a funcionar mejor con UTF-8, ya que el tamaño de la unidad en UTF-8 es el mismo que en ASCII, y la mayoría de estos protocolos fueron diseñados en la era de ASCII. Por otro lado, UTF-16 ofrece el mejor rendimiento promedio de espacio / procesamiento al representar todos los idiomas vivos.

El estándar Unicode define menos puntos de código de los que se pueden representar en 32 bits. Por lo tanto, a todos los efectos prácticos, UTF-32 y UCS4 se convirtieron en la misma codificación, ya que es poco probable que tenga que lidiar con caracteres de unidades múltiples en UTF-32.

Espero que llene algunos detalles.

Scott Tesler
fuente
99
Conceptualmente, UCS-2 y UCS-4 son conjuntos de caracteres , no codificaciones de caracteres (de ahí el nombre).
Caracol mecánico el
74
@Tuukka Los errores en esta publicación son legión. Hay más de 2 versiones de ISO 8859. ASCII no funcionaba para inglés, faltaba cosas como comillas, signos de centavo, acentos y mucho más: Unicode no se trata solo de inglés; ¡El inglés también lo necesita! Ningún punto de código ocupa más de 4 bytes en CUALQUIER codificación; Este negocio de 6 bytes es totalmente incorrecto. No puede codificar en UTF ningún valor escalar Unicode como dice: los sustitutos y los otros 66 caracteres no están prohibidos. UCS-4 y UTF-32 no son lo mismo. No hay UTF-32 de unidades múltiples. ¡UTF-16 no es tan eficiente como pretenden - & c & c & c!
tchrist
1
ASCII tampoco contiene el signo de libra £, y por supuesto no contiene el signo de euro € (que es considerablemente más joven que ASCII).
TRiG
1
@tchrist Parece que 6 bytes no son improbables después de todo. Vea esto: joelonsoftware.com/articles/Unicode.html que denota que hay un espacio de caracteres de 0x04000000a 0x7FFFFFFF, o en binario, 1111110v 10vvvvvv 10vvvvvv 10vvvvvv 10vvvvvv 10vvvvvv y eso es de hecho 6 bytes. Sin embargo, 6 bytes ES el máximo , y no como el artículo afirma confusamente "seis bytes o más ".
syntaxerror
12
@syntaxerror: "Solo los puntos de código 128 y superiores se almacenan usando 2, 3, de hecho, hasta 6 bytes". fue precisa cuando se escribió, pero más tarde ese mismo año (hace doce años) fue invalidada. en.wikipedia.org/wiki/UTF-8 dice "La especificación original abarcaba números de hasta 31 bits (el límite original del juego de caracteres universal). En noviembre de 2003, UTF-8 fue restringido por RFC 3629 para terminar en U + 10FFFF, para que coincida con las restricciones de la codificación de caracteres UTF-16. Esto eliminó todas las secuencias de 5 y 6 bytes, y aproximadamente la mitad de las secuencias de 4 bytes ".
Mooing Duck
237

Permítanme usar un ejemplo para ilustrar este tema:

A chinese character:      汉
it's unicode value:       U+6C49
convert 6C49 to binary:   01101100 01001001

Nada mágico hasta ahora, es muy simple. Ahora, digamos que decidimos almacenar este personaje en nuestro disco duro. Para hacer eso, necesitamos almacenar el personaje en formato binario. Simplemente podemos almacenarlo como es '01101100 01001001'. ¡Hecho!

Pero espera un minuto, ¿es '01101100 01001001' un carácter o dos caracteres? Sabías que este es un personaje porque te lo dije, pero cuando una computadora lo lee, no tiene idea. Entonces, necesitamos algún tipo de "codificación" para decirle a la computadora que lo trate como uno.

Aquí es donde entran las reglas de 'UTF-8': http://www.fileformat.info/info/unicode/utf8.htm

Binary format of bytes in sequence

1st Byte    2nd Byte    3rd Byte    4th Byte    Number of Free Bits   Maximum Expressible Unicode Value
0xxxxxxx                                                7             007F hex (127)
110xxxxx    10xxxxxx                                (5+6)=11          07FF hex (2047)
1110xxxx    10xxxxxx    10xxxxxx                  (4+6+6)=16          FFFF hex (65535)
11110xxx    10xxxxxx    10xxxxxx    10xxxxxx    (3+6+6+6)=21          10FFFF hex (1,114,111)

De acuerdo con la tabla anterior, si queremos almacenar este carácter usando el formato 'UTF-8', debemos anteponer nuestro carácter con algunos 'encabezados'. Nuestro carácter chino tiene 16 bits de longitud (cuente usted mismo el valor binario), por lo que utilizaremos el formato en la fila 3, ya que proporciona suficiente espacio:

Header  Place holder    Fill in our Binary   Result         
1110    xxxx            0110                 11100110
10      xxxxxx          110001               10110001
10      xxxxxx          001001               10001001

Escribir el resultado en una línea:

11100110 10110001 10001001

¡Este es el valor UTF-8 (binario) del carácter chino! (confirme usted mismo: http://www.fileformat.info/info/unicode/char/6c49/index.htm )

Resumen

A chinese character:      汉
it's unicode value:       U+6C49
convert 6C49 to binary:   01101100 01001001
embed 6C49 as UTF-8:      11100110 10110001 10001001

PD: si quieres aprender este tema en Python, haz clic aquí

Cheng
fuente
66
"Pero espera un minuto, ¿es '01101100 01001001' un carácter o dos caracteres? Sabías que este es un carácter porque te lo dije, pero cuando una computadora lo lee, no tiene idea. Por lo tanto, necesitamos algún tipo de" codificación "para dígale a la computadora que lo trate como uno ". Bien, ¿pero la computadora aún no sabe que debería codificarlo con utf-8?
Koray Tugay
15
@KorayTugay La computadora no sabe qué codificación debe usar. Tienes que decirlo cuando guardas un personaje en un archivo y también cuando lees un personaje de un archivo.
Cheng
3
@Connor La computadora no sabe qué formato usar. Cuando guarda el documento, el editor de texto debe establecer explícitamente su codificación para que sea utf-8 o cualquier formato que el usuario quiera usar. Además, cuando un programa editor de texto lee un archivo, debe seleccionar un esquema de codificación de texto para decodificarlo correctamente. Lo mismo ocurre cuando está escribiendo e ingresando una letra, el editor de texto necesita saber qué esquema usa para poder guardarlo correctamente.
Cheng
2
Entonces, ¿cómo se interpretan esos encabezados? si miro la primera tabla, entonces pienso: si el byte comienza con bit 0, el carácter está representado por 1 mordida (la actual), si el byte comienza con 110entonces el carácter está representado por 2 bytes (el actual y el siguiente ( bits restantes después 10)), si el byte comienza con 1110entonces, el carácter está representado por 3 bytes, el actual y los siguientes 2 bytes (bits restantes después 10).
JBoy
2
Lea 10 artículos sobre UTF-8; después de leer esto, entendí en 10 segundos :)
jrhee17
201

Desafortunadamente, "Unicode" se usa de varias maneras diferentes, según el contexto. Su uso más correcto (IMO) es como un conjunto de caracteres codificados , es decir, un conjunto de caracteres y un mapeo entre los caracteres y los puntos de código entero que los representan.

UTF-8 es una codificación de caracteres, una forma de convertir de secuencias de bytes a secuencias de caracteres y viceversa. Cubre todo el conjunto de caracteres Unicode. ASCII se codifica como un solo byte por carácter, y otros caracteres toman más bytes dependiendo de su punto de código exacto (hasta 4 bytes para todos los puntos de código definidos actualmente, es decir, hasta U-0010FFFF, y de hecho 4 bytes podrían soportar hasta U-001FFFFF).

Cuando se usa "Unicode" como el nombre de una codificación de caracteres (p. Ej., Como la propiedad .NET Encoding.Unicode ) generalmente significa UTF-16 , que codifica los caracteres más comunes como dos bytes. Algunas plataformas (especialmente .NET y Java) usan UTF-16 como codificación de caracteres "nativos". Esto lleva a problemas difíciles si necesita preocuparse por los caracteres que no pueden codificarse en un solo valor UTF-16 (están codificados como "pares sustitutos"), pero la mayoría de los desarrolladores nunca se preocupan por esto, IME.

Algunas referencias en Unicode:

Jon Skeet
fuente
16
Creo que UTF-16 solo es igual a "Unicode" en plataformas Windows. Las personas tienden a usar UTF-8 por defecto en * nix. +1 aunque, buena respuesta
jalf
10
@ Chris: No, ISO-8859-1 no es UTF-8. UTF-8 codifica U + 0080 a U + 00FF como dos bytes, no uno. Windows 1252 e ISO-8859-1 son en su mayoría iguales, pero difieren entre los valores 0x80 y 0x99 si no recuerdo mal, donde ISO 8859-1 tiene un "agujero" pero CP1252 define los caracteres.
Jon Skeet
13
La idea de llamar a UTF-16 "Unicode" me incomoda debido a su potencial de confusión, a pesar de que esto se señaló claramente como una convención de .NET solamente. UTF-16 es una forma de representar Unicode, pero no es "La codificación Unicode".
thomasrutter
66
@unwesen: UTF-8 no necesita pares sustitutos. Simplemente representa caracteres que no son BMP utilizando secuencias de bytes progresivamente más largas.
Jon Skeet el
55
@RoyiNamir: Sí, "Unicode" desafortunadamente se usa a menudo para significar "UTF-16" particularmente en Windows.
Jon Skeet
108

No son lo mismo: UTF-8 es una forma particular de codificar Unicode.

Puede elegir entre muchas codificaciones diferentes según su aplicación y los datos que desee utilizar. Los más comunes son UTF-8, UTF-16 y UTF-32 s, que yo sepa.

Greg
fuente
10
sin embargo, el punto es que algunos editores proponen guardar el archivo como "Unicode" O "UTF-8". Entonces, la mención sobre ese "Unicode" en ese caso es UTF-16, creo que es necesario.
serhio
71

Unicode solo define puntos de código , es decir, un número que representa un carácter. La forma en que almacena estos puntos de código en la memoria depende de la codificación que esté utilizando. UTF-8 es una forma de codificar caracteres Unicode, entre muchos otros.

Martin Cote
fuente
2
sin embargo, el punto es que algunos editores proponen guardar el archivo como "Unicode" O "UTF-8". Entonces, la mención sobre ese "Unicode" en ese caso es UTF-16, creo que es necesario.
serhio
Un número, que presenta un carácter, también hace ASCII.
brillante
66
lea esto antes y después de mirar el resto de las respuestas en esta página
Dodgie
33

Unicode es un estándar que define, junto con ISO / IEC 10646, el juego de caracteres universal (UCS), que es un superconjunto de todos los caracteres existentes necesarios para representar prácticamente todos los idiomas conocidos.

Unicode asigna un nombre y un número ( código de carácter o punto de código ) a cada carácter en su repertorio.

La codificación UTF-8 es una forma de representar estos caracteres digitalmente en la memoria de la computadora. UTF-8 asigna cada punto de código en una secuencia de octetos (bytes de 8 bits)

Por ejemplo,

Carácter UCS = Carácter Han Unicode

Punto de código UCS = U + 24B62

Codificación UTF-8 = F0 A4 AD A2 (hexadecimal) = 11110000 10100100 10101101 10100010 (bin)

senderos nocturnos
fuente
No, UTF-8 asigna solo puntos de código en una secuencia que es mayor que 127. Todo de 0 a 127 no es una secuencia sino un solo byte. Por cierto, ASCII también asigna un nombre de un personaje a un número, por lo que esto es lo mismo que hace Unicode. Pero Unicode no se detiene en el punto de código 127 sino que sube a 0x10ffff.
brillante
2
@brightly difiero. Los caracteres ascii se asignan a una secuencia de un solo byte. El primer bit, que es 0 en el caso del código para caracteres ascii, indica cuántos bytes siguen: cero. http://www.wikiwand.com/en/UTF-8#/DescriptionEcha un vistazo a la primera fila.
senderos nocturnos
Bueno, para mí una secuencia consta de más de un byte. Un carácter ASCII dentro de UTF-8 es un solo byte tal cual, con el bit más significativo establecido en 0. Los puntos de código superiores a 127 necesitan secuencias, que siempre tienen un byte de inicio y uno, dos o tres bytes siguientes. Entonces, ¿por qué llamarías a un solo byte una "secuencia"?
brillante
Bueno ... Muchas veces los abogados de lengua inglesa pueden confundirse por su mal uso intencional en el software. Es el mismo caso aquí. Puedes discutir sobre eso. Pero eso no lo aclarará más.
nightlytrails
1
@brighty Hmmm, en matemáticas, una secuencia de 0 elementos está bien. Una secuencia de 1 elemento también está bien aquí.
chux - Restablece a Monica
24

Unicode es solo un estándar que define un conjunto de caracteres ( UCS ) y codificaciones ( UTF ) para codificar este conjunto de caracteres. Pero en general, Unicode se refiere al conjunto de caracteres y no al estándar.

Lea el mínimo absoluto que todo desarrollador de software debe saber absolutamente, positivamente sobre los conjuntos de caracteres y Unicode (¡sin excusas!) Y Unicode en 5 minutos .

Gumbo
fuente
1
@serhio: lo sé. Aunque hay tres codificaciones UTF-16 diferentes: las dos UTF-16LE y UTF-16BE explícitas y la UTF-16 implícita donde la endianidad se especifica con una lista de materiales.
Gumbo
@Gumbo: la falta de una lista de materiales no significa que sea una codificación diferente. Solo hay dos codificaciones.
Mooing Duck
El blog anterior está escrito por el CEO de Stakcoverflow.
Shailesh Pratapwar
23

Las respuestas existentes ya explican muchos detalles, pero aquí hay una respuesta muy corta con la explicación más directa y el ejemplo.

Unicode es el estándar que asigna caracteres a puntos de código.
Cada carácter tiene un punto de código único (número de identificación), que es un número como 9731.

UTF-8 es la codificación de los puntos de código.
Para almacenar todos los caracteres en el disco (en un archivo), UTF-8 divide los caracteres en hasta 4 octetos (secuencias de 8 bits) - bytes. UTF-8 es una de varias codificaciones (métodos para representar datos). Por ejemplo, en Unicode, el punto de código (decimal) 9731 representa un muñeco de nieve ( ), que consta de 3 bytes en UTF-8:E2 98 83

Aquí hay una lista ordenada con algunos ejemplos aleatorios .

básico6
fuente
1
¡No! UTF-8 es una buena manera de codificar caracteres unicode pero también podemos codificar en UTF-16 o UTF-32. Con UTF-32 tenemos una relación 1: 1 entre DWORD y codepoint, con UTF-16 tenemos una relación 1: 1 entre WORD y codepoint solo para puntos de código de BMP, excluyendo los sustitutos y BOM. En UTF-8 tenemos una relación 1: 1 entre el punto de código de bytes y sólo para los puntos de código <127.
brighty
55
@brighty: Correcto, pero ¿por qué "No"? Escribí "UTF-8 es una de varias codificaciones" porque también hay UTF-16 y UTF-32.
basic6
16

1. Unicode

Hay muchos personajes en todo el mundo, como "$, &, h, a, t,?, 张, 1, =, + ...".

Luego viene una organización que se dedica a estos personajes,

Hicieron un estándar llamado "Unicode".

El estándar es el siguiente:

  • cree una forma en la que cada posición se llame "punto de código" o "posición de código".
  • Todas las posiciones son de U + 0000 a U + 10FFFF;
  • Hasta ahora, algunas posiciones están llenas de caracteres y otras posiciones están guardadas o vacías.
  • Por ejemplo, la posición "U + 0024" se llena con el carácter "$".

PD: Por supuesto, hay otra organización llamada ISO que mantiene otro estándar: "ISO 10646", casi lo mismo.

2. UTF-8

Como se indicó anteriormente, U + 0024 es solo una posición, por lo que no podemos guardar "U + 0024" en la computadora para el carácter "$".

Debe haber un método de codificación.

Luego vienen los métodos de codificación, como UTF-8, UTF-16, UTF-32, UCS-2 ...

Bajo UTF-8, el punto de código "U + 0024" está codificado en 00100100.

00100100 es el valor que ahorramos en la computadora por "$".

wengeezhang
fuente
1
En general, UTF-8 es la única variante que alguien usa hoy en día.
Rick James el
2
ISO 10646 es un estándar idéntico al juego de caracteres Unicode. Unicode define muchas otras cosas además del conjunto de caracteres, como las reglas de clasificación, casos, etc. ISO 10646 es solo el conjunto de caracteres (de los cuales actualmente hay más de 130,000). El Consorcio Unicode e ISO desarrollan Unicode conjuntamente, con ISO solo preocupado por el conjunto de caracteres y sus codificaciones, y Unicode también define las propiedades de los caracteres y las reglas para procesar el texto.
thomasrutter
12

He comprobado los enlaces en la respuesta de Gumbo, y también quería pegar alguna parte de esas cosas para que exista en Stack Overflow.

"... Algunas personas tienen la idea errónea de que Unicode es simplemente un código de 16 bits donde cada carácter tiene 16 bits y, por lo tanto, hay 65.536 caracteres posibles. Esto no es, en realidad, correcto. Es el mito más común sobre Unicode , así que si pensabas eso, no te sientas mal.

De hecho, Unicode tiene una forma diferente de pensar acerca de los personajes, y hay que entender la forma de pensar Unicode de las cosas o nada tendrá sentido.

Hasta ahora, hemos asumido que una letra se asigna a algunos bits que puede almacenar en el disco o en la memoria:

A -> 0100 0001

En Unicode, una letra se asigna a algo llamado un punto de código que todavía es solo un concepto teórico. Cómo se representa ese punto de código en la memoria o en el disco es otra historia ... "

"... El consorcio Unicode asigna a cada letra platónica de cada alfabeto un número mágico que se escribe así: U + 0639. Este número mágico se llama un punto de código. El U + significa" Unicode "y los números son hexadecimales. U + 0639 es la letra árabe Ain. La letra A en inglés sería U + 0041 .... "

"... OK, entonces digamos que tenemos una cadena:

Hola

que, en Unicode, corresponde a estos cinco puntos de código:

U + 0048 U + 0065 U + 006C U + 006C U + 006F.

Solo un montón de puntos de código. Números, de verdad. Todavía no hemos dicho nada sobre cómo almacenar esto en la memoria o representarlo en un mensaje de correo electrónico ... "

"... Ahí es donde entran las codificaciones.

La primera idea para la codificación Unicode, que llevó al mito sobre los dos bytes, fue, oye, almacenemos esos números en dos bytes cada uno. Entonces hola se convierte

00 48 00 65 00 6C 00 6C 00 6F

¿Derecha? ¡No tan rapido! ¿No podría ser también:

48 00 65 00 6C 00 6C 00 6F 00? ... "

kommradHomer
fuente
En ASCII, una letra también se asigna a un punto de código, no solo en Unicode.
brillante
8

UTF-8 es un posible esquema de codificación para texto Unicode .

Unicode es un estándar de alcance amplio que define más de 130,000 caracteres y asigna a cada uno un código numérico (un punto de código). También define reglas sobre cómo ordenar este texto, normalizarlo, cambiar su caso y más. Un carácter en Unicode está representado por un punto de código desde cero hasta 0x10FFFF inclusive, aunque algunos puntos de código están reservados y no pueden usarse para caracteres.

Hay más de una forma en que una cadena de puntos de código Unicode se puede codificar en una secuencia binaria. Estos se llaman "codificaciones". La codificación más sencilla es UTF-32 , que simplemente almacena cada punto de código como un entero de 32 bits, cada uno con 4 bytes de ancho.

UTF-8 es otra codificación, y se está convirtiendo en el estándar de facto, debido a una serie de ventajas sobre UTF-32 y otros. UTF-8 codifica como una secuencia de valores de un solo byte. Cada punto de código puede usar un número variable de estos valores de bytes. Los puntos de código en el rango ASCII se codifican desnudos para ser compatibles con ASCII. Los puntos de código fuera de este rango usan un número variable de bytes, ya sea 2, 3 o 4, dependiendo del rango en el que se encuentren.

UTF-8 ha sido diseñado con estas propiedades en mente:

  • Los caracteres ASCII se codifican exactamente como en ASCII, de modo que una cadena ASCII también es una cadena UTF-8 válida.

  • Ordenación binaria: la clasificación de cadenas UTF-8 utilizando una ordenación binaria ingenua seguirá dando como resultado que todos los puntos de código se ordenen en orden numérico.

  • Los caracteres que requieren varios bytes no contienen ningún valor de byte en el rango ASCII, lo que garantiza que parte de ellos no pueda confundirse con caracteres ASCII. Esta también es una característica de seguridad.

  • UTF-8 se puede validar fácilmente y un validador puede distinguirlo de otras codificaciones de caracteres. El texto en otras codificaciones de 8 bits o de varios bytes rara vez también se validará como UTF-8.

  • Acceso aleatorio: en cualquier punto de la cadena UTF-8 es posible saber si el byte en esa posición es el primer byte de un carácter o no, y encontrar el inicio del siguiente o actual carácter, sin necesidad de escanear hacia adelante o al revés más de unos pocos bytes o leer cualquier cosa al comienzo de la secuencia.

thomasrutter
fuente
Un par de puntos menores: [1] ¿No deberían cambiarse los "caracteres ASCII exactamente como están en ASCII " a "Los caracteres ASCII están codificados exactamente como están en UTF-8 " ? [2] La frase "Los códigos en Unicode ..." no está clara (para mí). ¿Te refieres a "puntos de código Unicode ..." ?
skomisa
@skomisa para el punto 1, quise decir que la codificación de caracteres dentro del rango ASCII es idéntica para ASCII y para UTF-8.
thomasrutter
Para el punto 2, ese es un punto justo y lo editaré para que quede más claro
editaré
2

Son lo mismo, ¿no?

No, no lo son.


Creo que la primera oración de la página de Wikipedia a la que hizo referencia ofrece un resumen breve y agradable:

UTF-8 es una codificación de caracteres de ancho variable capaz de codificar todos los 1.112.064 puntos de código válidos en Unicode utilizando de uno a cuatro bytes de 8 bits.

Elaborar:

  • Unicode es un estándar, que define un mapa de caracteres a números, los llamados puntos de código (como en el ejemplo a continuación). Para el mapeo completo, puedes echar un vistazo aquí .

    ! -> U+0021 (21),  
    " -> U+0022 (22),  
    \# -> U+0023 (23)
    
  • UTF-8 es una de las formas de codificar estos puntos de código en una forma que una computadora puede entender, también conocida como bits . En otras palabras, es una forma / algoritmo para convertir cada uno de esos puntos de código en una secuencia de bits o convertir una secuencia de bits en los puntos de código equivalentes. Tenga en cuenta que hay muchas codificaciones alternativas para Unicode.


Joel da una buena explicación y una visión general de la historia aquí. .

Dimos
fuente
2

Si puedo resumir lo que reuní de este hilo:

Unicode 'traduce' los caracteres a números ordinales (en forma decimal) .

à = 224

UTF-8 es una codificación que 'traduce' estos números a representaciones binarias .

224 = 11000011 10100000

Tenga en cuenta que estamos hablando de la representación binaria de 224, no de su forma binaria, que es 0b11100000.

remykarem
fuente
2

Este artículo explica todos los detalles http://kunststube.net/encoding/

ESCRIBIR AL BUFFER

Si escribe en un búfer de 4 bytes, símbolo con codificación UTF8, su binario se verá así:

00000000 11100011 10000001 10000010

si escribe en un búfer de 4 bytes, símbolo con codificación UTF16, su binario se verá así:

00000000 00000000 00110000 01000010

Como puede ver, dependiendo del idioma que usaría en su contenido, esto afectará su memoria en consecuencia.

Por ejemplo, para este símbolo en particular: la codificación UTF16 es más eficiente ya que tenemos 2 bytes de repuesto para usar para el siguiente símbolo. Pero eso no significa que deba usar UTF16 para el alfabeto japonés.

LEYENDO DEL BUFFER

Ahora, si desea leer los bytes anteriores, debe saber en qué codificación se escribió y decodificar de nuevo correctamente.

por ejemplo, si decodifica esto: 00000000 11100011 10000001 10000010 en codificación UTF16, terminará sin

Nota: La codificación y Unicode son dos cosas diferentes. Unicode es la gran (tabla) con cada símbolo asignado a un punto de código único. Por ejemplo, el símbolo (letra) tiene un (punto de código) : 30 42 (hexadecimal). La codificación, por otro lado, es un algoritmo que convierte los símbolos de manera más adecuada, cuando se almacena en el hardware.

30 42 (hex) - > UTF8 encoding - > E3 81 82 (hex), which is above result in binary.

30 42 (hex) - > UTF16 encoding - > 30 42 (hex), which is above result in binary.

ingrese la descripción de la imagen aquí

InGeek
fuente
muy buen artículo vinculado, espero que continúe activo
yolob 21
0

UTF-8 es un método para codificar caracteres Unicode utilizando secuencias de 8 bits.

Unicode es un estándar para representar una gran variedad de caracteres de muchos idiomas.

akaMahesh
fuente
44
¿"Secuencias de 8 bits" ...? Podría querer especificar eso con mayor precisión ...
deceze