inputenc error codificacion unicode encoding utf-8 character-encoding terminology

unicode - error - utf-64



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

He escuchado opiniones contradictorias de personas, según Wikipedia, consulte aquí .

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


Son lo mismo, ¿no?

No, no lo son.

Creo que la primera oración de la página de Wikipedia a la que hace referencia ofrece un breve 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 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 here .

    ! -> 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 conocido 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 explicación muy agradable y una visión general de la historia here .


1. Unicode

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

Luego viene una organización que está dedicada a estos personajes,

Hicieron un estándar llamado "Unicode".

El estándar es como sigue:

  • 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 se guardan o están vacías.
  • Por ejemplo, la posición "U + 0024" se rellena con el carácter "$".

PD: Por supuesto, hay otra organización llamada ISO que mantiene otra norma: "ISO 10646", casi la misma.

2. UTF-8

Como arriba, U + 0024 es solo una posición, así 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" se codifica en 00100100.

00100100 es el valor que guardamos en la computadora para "$".


Desafortunadamente, "Unicode" se usa de varias maneras diferentes, dependiendo del contexto. Su uso más correcto (IMO) es como un conjunto de caracteres codificados , es decir, un conjunto de caracteres y una asignación 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 la totalidad del 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 pueden hacer frente a hasta U-001FFFFF).

Cuando "Unicode" se usa como el nombre de una codificación de caracteres (por ejemplo, como la propiedad .NET Encoding.Unicode ) por lo general significa UTF-16 , que codifica los caracteres más comunes como dos bytes. Algunas plataformas (en particular, .NET y Java) utilizan UTF-16 como su codificación de caracteres "nativa". Esto conduce a problemas graves 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:


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

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

De hecho, Unicode tiene una forma diferente de pensar en los personajes, y usted tiene que entender la forma en que Unicode piensa 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 que se llama un punto de código que todavía es solo un concepto teórico. Cómo 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 parte del consorcio Unicode, que se escribe así: U + 0639. Este número mágico se denomina punto de código. 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, así que 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.

Sólo un montón de puntos de código. Los 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 idea más antigua para la codificación Unicode, que llevó al mito sobre los dos bytes, fue, oye, almacenemos esos números en dos bytes cada uno. Así que 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? ...


Las respuestas existentes ya explican muchos detalles, pero aquí hay una respuesta muy breve 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 una 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 .


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

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


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 tales como bytes ... omitiendo un poco de historia aquí e ignorando los problemas de direccionamiento de memoria, las computadoras de 8 bits tratarán un byte de 8 bits como la unidad numérica más grande representada fácilmente en el hardware, las computadoras de 16 bits se expandirían que a dos bytes, y así sucesivamente.

Las antiguas codificaciones de caracteres como ASCII son de la era (pre) de 8 bits, y tratan de abarrotar el lenguaje dominante en la computación 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úscula como en mayúscula, números y signos de puntuación, funcionó bastante bien. ASCII se extendió en un octavo bit para otros idiomas que no están en inglés, pero los 128 números / puntos de código adicionales disponibles por esta expansión se asignarán a diferentes caracteres según el idioma que se muestre. Las normas 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 de la norma 8859 ISO).

Pero eso no es suficiente cuando se quieren representar caracteres de más de un idioma, por lo que no basta con agrupar todos los caracteres disponibles en un solo byte.

Hay esencialmente 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 inherentemente del mismo problema que los estándares 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 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. Luego, 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 carácter completamente. Por lo tanto, los caracteres más comunes (en 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 múltiples bytes (debo decir que múltiples 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 las operaciones como la búsqueda de subcadenas, comparaciones, etc., tienen que descodificar los caracteres a código Unicode. puntos antes de que se puedan realizar tales operaciones (aunque hay algunos accesos directos).

Tanto los estándares UCS como los estándares UTF codifican los puntos de código definidos 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 están predeterminados a 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 ASCII. Por otro lado, UTF-16 ofrece el mejor rendimiento promedio de espacio / procesamiento cuando se representan todos los idiomas vivos.

El estándar Unicode define menos puntos de código que 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 rellene algunos detalles.


Permítame 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 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 personaje 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 la trate como una sola.

Aquí es donde entran las reglas de ''UTF-8'' en: 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 utilizando el formato ''UTF-8'', debemos prefijar nuestro carácter con algunos ''encabezados''. Nuestro carácter chino tiene 16 bits de largo (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 )

Resumen

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


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.



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

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


Unicode es un estándar de amplio alcance 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 se pueden usar para los caracteres.

Los códigos en Unicode se pueden representar en más de una codificación. El más simple es UTF-32, que simplemente codifica el punto de código como enteros de 32 bits, con cada uno de 4 bytes de ancho.

UTF-8 es otra codificación, y se está convirtiendo rápidamente en el estándar de facto. Se codifica como una secuencia de valores de bytes. Cada punto de código puede usar un número variable de estos bytes. Los puntos de código en el rango ASCII se codifican directamente, para ser compatibles con ASCII. Los puntos de código fuera de este rango utilizan un número variable de bytes, ya sea 2, 3 o 4, según el rango en el que se encuentren.

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

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

  • Clasificación binaria: la clasificación de cadenas UTF-8 utilizando una ordenación binaria ingenua aún dará lugar a que todos los puntos de código se clasifiquen en orden numérico.

  • Los caracteres fuera del rango ASCII no utilizan ningún byte en el rango ASCII, lo que garantiza que no se pueden confundir con caracteres ASCII. Esta es también una característica de seguridad.

  • UTF-8 puede ser validado fácilmente, y distinguido de otras codificaciones de caracteres por un validador. El texto en otras codificaciones de 8 bits o de múltiples bytes rara vez 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 retroceder hasta el inicio de ese carácter, sin necesidad de referirse a nada en El inicio de la cadena.


Unicode es un estándar que define, junto con ISO / IEC 10646, el Conjunto de caracteres universales (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 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 (ubicación)