He escuchado opiniones contradictorias de personas, según la página Wikipedia UTF-8 .
Son lo mismo, ¿no? ¿Alguien puede aclarar?
He escuchado opiniones contradictorias de personas, según la página Wikipedia UTF-8 .
Son lo mismo, ¿no? ¿Alguien puede aclarar?
Respuestas:
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.
0x04000000
a 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 ".
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 )
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í
0
, el carácter está representado por 1 mordida (la actual), si el byte comienza con 110
entonces el carácter está representado por 2 bytes (el actual y el siguiente ( bits restantes después 10
)), si el byte comienza con 1110
entonces, el carácter está representado por 3 bytes, el actual y los siguientes 2 bytes (bits restantes después 10
).
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:
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.
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.
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)
http://www.wikiwand.com/en/UTF-8#/Description
Echa un vistazo a la primera fila.
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 .
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 .
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:
PD: Por supuesto, hay otra organización llamada ISO que mantiene otro estándar: "ISO 10646", casi lo mismo.
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 "$".
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? ... "
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.
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í. .
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.
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.