He escuchado opiniones contradictorias de personas, según la página de Wikipedia UTF-8 .
Son lo mismo, ¿no? ¿Alguien puede aclarar?
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 dirección 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 antiguas, como ASCII, son de la era (anterior) de los 8 bits y tratan de agrupar el idioma dominante en la informática en ese momento, es decir, el inglés, en números que van de 0 a 127 (7 bits). Con 26 letras en el alfabeto, tanto en mayúsculas como en no mayúsculas, números y signos de puntuación, funcionó bastante bien. ASCII se extendió en un octavo bit para otros idiomas distintos del inglés, pero los 128 números / puntos de código adicionales disponibles por esta expansión se asignarían a diferentes caracteres según el 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, hay dos tipos diferentes de codificaciones: uno 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 inherentemente el mismo problema que las normas ASCII e ISO-8859, ya que su rango de valores sigue siendo limitado, incluso si el límite es mucho más alto.
El otro tipo de codificación usa 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. Luego, el estándar define algunos de estos bits como banderas: si están configurados, la siguiente unidad en una secuencia de unidades debe considerarse parte del mismo carácter. Si no están configurados, esta unidad representa un carácter 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 del idioma pueden ocupar seis bytes o más.
Las codificaciones de varios bytes (debería decir 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 es que las operaciones como encontrar subcadenas, comparaciones, etc., tienen que decodificar los caracteres en código Unicode. puntos antes de que se puedan realizar tales operaciones (aunque existen 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 los UNIX utilizan UTF-8 por defecto en estos días. Los protocolos de comunicación 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 se diseñaron en la era ASCII. Por otro lado, UTF-16 ofrece el mejor rendimiento promedio de espacio / procesamiento al representar todos los lenguajes vivos.
El estándar Unicode define menos puntos de código de los que se pueden representar en 32 bits. Por lo tanto, para todos los propósitos 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 complete algunos detalles.
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 carácter en nuestro disco duro. Para hacer eso, necesitamos almacenar el carácter en formato binario. Simplemente podemos almacenarlo como está '01101100 01001001'. ¡Hecho!
Pero espere un minuto, ¿es '01101100 01001001' uno o dos caracteres? Sabías que este es un carácter porque te lo dije, pero cuando una computadora lo lee, no tiene idea. Así que necesitamos algún tipo de "codificación" para decirle a la computadora que lo trate como tal.
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', necesitamos prefijar nuestro carácter con algunos 'encabezados'. Nuestro carácter chino tiene una longitud de 16 bits (cuente el valor binario usted mismo), por lo que usaremos 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
Escribiendo el resultado en una línea:
11100110 10110001 10001001
¡Este es el valor UTF-8 (binario) del carácter chino! (confírmelo 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 desea aprender este tema en Python, haga clic aquí
Desafortunadamente, "Unicode" se usa de varias formas 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 hacer frente a hasta U-001FFFFF).
Cuando se usa "Unicode" como el nombre de una codificación de caracteres (por ejemplo, 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) utilizan UTF-16 como su codificación de caracteres "nativa". Esto conduce a problemas complicados si necesita preocuparse por los caracteres que no se pueden codificar 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 sobre Unicode:
No son lo mismo: UTF-8 es una forma particular de codificar Unicode.
Hay muchas codificaciones diferentes entre las que puede elegir según su aplicación y los datos que desee utilizar. Los más comunes son UTF-8, UTF-16 y UTF-32 hasta donde yo sé.
Unicode solo define puntos de código , es decir, un número que representa un carácter. La forma de almacenar 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 muchas otras.
Unicode es un estándar que define, junto con ISO / IEC 10646, Universal Character Set (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 de su repertorio.
La codificación UTF-8 es una forma de representar estos caracteres digitalmente en la memoria de la computadora. UTF-8 mapea 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 (hex) = 11110000 10100100 10101101 10100010 (bin)
Unicode es solo un estándar que define un juego de caracteres ( UCS ) y codificaciones ( UTF ) para codificar este juego de caracteres. Pero en general, Unicode se refiere al juego de caracteres y no al estándar.
Lea el mínimo absoluto que todo desarrollador de software debe conocer absoluta y positivamente sobre Unicode y conjuntos de caracteres (¡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 y el ejemplo más directos.
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 de representación de 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 caracteres 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 que hay otra organización llamada ISO que mantiene otro estándar: "ISO 10646", casi el mismo.
Como arriba, 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 ...
En UTF-8, el punto de código "U + 0024" se codifica en 00100100.
00100100 es el valor que guardamos en la computadora para "$".
Revisé los enlaces en la respuesta de Gumbo y quería pegar parte de esas cosas aquí para que también existieran 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 toma 16 bits y, por lo tanto, hay 65.536 caracteres posibles. Esto, en realidad, no es correcto. Es el mito más común sobre Unicode , así que si pensaba eso, no se sienta mal.
De hecho, Unicode tiene una forma diferente de pensar sobre los personajes, y tienes que entender la forma Unicode de pensar 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 punto de código que sigue siendo solo un concepto teórico. La forma en que ese punto de código se representa en la memoria o en el disco es otra historia ... "
"... A cada letra platónica en cada alfabeto se le asigna un número mágico por el consorcio Unicode que se escribe así: U + 0639. Este número mágico se llama un punto de código. La U + significa" Unicode "y los números son hexadecimales. U + 0639 es la letra árabe Ain. La letra inglesa A sería U + 0041 .... "
"... Está bien, 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, simplemente almacenemos esos números en dos bytes cada uno. Así que hola se convierte en
00 48 00 65 00 6C 00 6C 00 6F
¿Correcto? ¡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 amplio alcance que define más de 140.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 de codificar una cadena de puntos de código Unicode en una secuencia binaria. Estos se denominan "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 de los cuales tiene 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 otras. UTF-8 codifica cada punto de código como una secuencia de valores de 1, 2, 3 o 4 bytes. Los puntos de código en el rango ASCII se codifican como un valor de un solo byte, para que sean compatibles con ASCII. Los puntos de código fuera de este rango usan 2, 3 o 4 bytes cada uno, dependiendo del rango en el que se encuentren.
UTF-8 se ha diseñado teniendo en cuenta estas propiedades:
Los caracteres ASCII se codifican exactamente como están en ASCII, de modo que una cadena ASCII también es una cadena UTF-8 válida que representa los mismos caracteres.
Clasificación binaria: la clasificación de cadenas UTF-8 mediante una clasificación binaria dará como resultado que todos los puntos de código se ordenen en orden numérico.
Cuando un punto de código utiliza varios bytes, ninguno de esos bytes contiene valores en el rango ASCII, lo que garantiza que ninguna parte de ellos pueda confundirse con un carácter ASCII. Esta también es una característica de seguridad.
UTF-8 puede validarse fácilmente y distinguirse de otras codificaciones de caracteres mediante un validador. El texto en otras codificaciones de 8 bits o de varios bytes rara vez también se validará como UTF-8 debido a la estructura muy específica de UTF-8.
Acceso aleatorio: en cualquier punto de una 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 carácter siguiente o actual, sin necesidad de buscar hacia adelante o hacia atrás más de 3 bytes o para saber qué tan lejos de la cadena comenzamos a leer.
Este artículo explica todos los detalles. http://kunststube.net/encoding/
ESCRIBIR PARA 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 use 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 en el siguiente símbolo. Pero no significa que deba usar UTF16 para el alfabeto japonés.
LECTURA DEL BÚFER
Ahora, si desea leer los bytes anteriores, debe saber en qué codificación se escribió y decodificarlo 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 (tabla) grande 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 a una forma más apropiada, cuando se almacenan en 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.
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 breve y agradable resumen:
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 siguiente). Para ver el mapeo completo, puede 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 pueda entender, también conocida como bits . En otras palabras, es una forma / algoritmo de convertir cada uno de esos puntos de código en una secuencia de bits o convertir una secuencia de bits en puntos de código equivalentes. Tenga en cuenta que hay muchas codificaciones alternativas para Unicode.
Joel da una explicación muy bonita y una descripción general de la historia aquí .
Si puedo resumir lo que reuní de este hilo:
Unicode 'traduce' 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.
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.
La estrella de HGTV, Christina Hall, revela que le diagnosticaron envenenamiento por mercurio y plomo, probablemente debido a su trabajo como manipuladora de casas.
Recientemente salió a la luz un informe policial que acusa a la estrella de 'Love Is Blind', Brennon, de violencia doméstica. Ahora, Brennon ha respondido a los reclamos.
Conozca cómo Wynonna Judd se dio cuenta de que ahora es la matriarca de la familia mientras organizaba la primera celebración de Acción de Gracias desde que murió su madre, Naomi Judd.
Descubra por qué un destacado experto en lenguaje corporal cree que es fácil trazar "tales paralelismos" entre la princesa Kate Middleton y la princesa Diana.
Los inodoros arrojan columnas de aerosol invisibles con cada descarga. ¿Como sabemos? La prueba fue capturada por láseres de alta potencia.
Air travel is far more than getting from point A to point B safely. How much do you know about the million little details that go into flying on airplanes?
The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!
¿Sigue siendo efectivo ese lote de repelente de insectos que te quedó del verano pasado? Si es así, ¿por cuánto tiempo?
Anteriormente, Kotaku informó que un hotel Godzilla se estaba abriendo en Tokio este abril. Junto al hotel, estaba programada la aparición de una enorme cabeza de 'Zilla, pero todo lo que hemos visto fueron imágenes conceptuales computarizadas.
Foto: Getty Desde que lanzó The Boring Company hace un año, Elon Musk ha mencionado varios sitios de construcción posibles para el negocio de perforación de túneles y ha descartado una vaga referencia a una aprobación gubernamental "verbal" para un túnel Hyperloop que conecta la ciudad de Nueva York y Washington. , CC. Pero ahora sabemos que al menos un alcalde quiere que Musk perfore un agujero debajo de su ciudad.
Tapas elásticas de silicona de Tomorrow's Kitchen, paquete de 12 | $14 | Amazonas | Código promocional 20OFFKINJALids son básicamente los calcetines de la cocina; siempre perdiéndose, dejando contenedores huérfanos que nunca podrán volver a cerrarse. Pero, ¿y si sus tapas pudieran estirarse y adaptarse a todos los recipientes, ollas, sartenes e incluso frutas en rodajas grandes que sobran? Nunca más tendrás que preocuparte por perder esa tapa tan específica.
Hemos pirateado algunas ciudades industriales en esta columna, como Los Ángeles y Las Vegas. Ahora es el momento de una ciudad militar-industrial-compleja.
El equipo está a la espera de las medallas que ganó en los Juegos Olímpicos de Invierno de 2022 en Beijing, ya que se está resolviendo un caso de dopaje que involucra a la patinadora artística rusa Kamila Valieva.
Miles de compradores de Amazon recomiendan la funda de almohada de seda Mulberry, y está a la venta en este momento. La funda de almohada de seda viene en varios colores y ayuda a mantener el cabello suave y la piel clara. Compre las fundas de almohada de seda mientras tienen hasta un 46 por ciento de descuento en Amazon
El jueves se presentó una denuncia de delito menor amenazante agravado contra Joe Mixon.
El Departamento de Policía de Lafayette comenzó a investigar a un profesor de la Universidad de Purdue en diciembre después de recibir varias denuncias de un "hombre sospechoso que se acercaba a una mujer".
Al igual que el mundo que nos rodea, el lenguaje siempre está cambiando. Mientras que en eras anteriores los cambios en el idioma ocurrían durante años o incluso décadas, ahora pueden ocurrir en cuestión de días o incluso horas.
Estoy de vuelta por primera vez en seis años. No puedo decirte cuánto tiempo he estado esperando esto.
“And a river went out of Eden to water the garden, and from thence it was parted and became into four heads” Genesis 2:10. ? The heart is located in the middle of the thoracic cavity, pointing eastward.
Creo, un poco tarde en la vida, en dar oportunidades a la gente. Generosamente.