¿Cuántos caracteres puede codificar UTF - 8?


Si UTF-8 es de 8 bits, ¿no significa que solo puede haber un máximo de 256 caracteres diferentes?

Los primeros 128 puntos de código son los mismos que en ASCII. Pero dice UTF-8 puede soportar hasta millones de caracteres?

¿Cómo funciona esto?

Author: mklement0, 2012-04-19

9 answers

UTF-8 no usa un byte todo el tiempo, es de 1 a 4 bytes.

Los primeros 128 caracteres (US-ASCII) necesitan un byte.

Los siguientes 1.920 caracteres necesitan dos bytes para codificar. Esto cubre el resto de casi todos los alfabetos latinos, y también los alfabetos Griego, Cirílico, Copto, Armenio, Hebreo, Árabe, Siríaco y Tāna, así como la Combinación de Marcas Diacríticas.

Se necesitan tres bytes para los caracteres en el resto del Plano Multilingüe Básico, que contiene prácticamente todos los caracteres de uso común [12] incluyendo la mayoría de los caracteres chinos, japoneses y coreanos [CJK].

Se necesitan cuatro bytes para los caracteres en los otros planos de Unicode, que incluyen caracteres CJK menos comunes, varias escrituras históricas, símbolos matemáticos y emoji (símbolos pictográficos).

Fuente: Wikipedia

 89
Author: zwippie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-02 13:53:03

UTF-8 usa 1-4 bytes por carácter: un byte para caracteres ascii (los primeros 128 valores unicode son los mismos que ascii). Pero eso solo requiere 7 bits. Si se establece el bit más alto ("signo"), esto indica el inicio de una secuencia de varios bytes; el número de bits altos consecutivos indica el número de bytes, luego un 0, y los bits restantes contribuyen al valor. Para los otros bytes, los dos bits más altos serán 1 y 0 y los 6 bits restantes son para el valor.

Así que un cuatro la secuencia de bytes comenzaría con 11110... (... = tres bytes para el valor) luego tres bytes con 6 bits cada uno para el valor, dando un valor de 21 bits. 2^21 supera el número de caracteres unicode, por lo que todo unicode puede expresarse en UTF8.

 31
Author: delicateLatticeworkFever,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-31 15:24:15

De acuerdo con esta tabla * UTF-8 debería apoyar:

231 = 2,147,483,648 caracteres

Sin embargo, RFC 3629 restringió los valores posibles, por lo que ahora estamos limitados a 4 bytes , lo que nos da

221 = 2,097,152 caracteres

Tenga en cuenta que una buena parte de esos caracteres están "reservados" para uso personalizado, lo que en realidad es bastante útil para las fuentes de iconos.

* Wikipedia usada muestra una tabla con 6 bytes they desde entonces actualizado el artículo.

2017-07-11: Corregido para contar dos veces el mismo punto de código codificado con múltiples bytes

 17
Author: mpen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-18 23:11:05

2.164.864 "caracteres" pueden ser potencialmente codificados por UTF-8.

Este número es 2^7 + 2^11 + 2^16 + 2^21 que viene de la forma en que funciona la codificación:

  • 1-los caracteres de byte tienen 7 bits para la codificación 0xxxxxxx (0x00-0x7F)

  • 2-los caracteres de byte tienen 11 bits para la codificación 110xxxxx 10xxxxxx (0xC0-0xDF para el primer byte; 0x80-0xBF para el segundo)

  • 3-los caracteres de byte tienen 16 bits para la codificación 1110xxxx 10xxxxxx 10xxxxxx (0xE0-0xEF para el primer byte; 0x80-0xBF para la continuación bytes)

  • 4-los caracteres de byte tienen 21 bits para la codificación 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx (0xF0-0xF7 para el primer byte; 0x80-0xBF para los bytes de continuación)

Como puede ver, esto es significativamente más grande que el Unicode actual (1.112.064 caracteres).

 8
Author: Ruben Reyes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-12 10:19:01

Unicode vs UTF-8

Unicode resuelve los puntos de código a caracteres. UTF-8 es un mecanismo de almacenamiento para Unicode. Unicode tiene una especificación. UTF-8 tiene una especificación. Ambos tienen diferentes límites. UTF-8 tiene un límite hacia arriba diferente.

Unicode

Unicode se designa con "planos." Cada avión lleva 216 puntos clave. Hay 17 Aviones en Unicode. Para un total de 17 * 2^16 puntos de código. El primer plano , plano 0 o el BMP , es especial en el peso de lo que lleva.

En lugar de explicar todos los matices, permítanme citar el artículo anterior sobre planos.

Los 17 aviones pueden acomodar 1.114.112 puntos de código. De estos, 2.048 son sustitutos, 66 no son caracteres, y 137.468 están reservados para uso privado, dejando 974.530 para asignación pública.

UTF-8

Ahora volvamos al artículo enlazado arriba,

El esquema de codificación utilizado por UTF-8 fue diseñado con un límite mucho mayor de 231 codificar puntos (32.768 planos), y puede codificar 221 puntos de código (32 planos) incluso si están limitados a 4 bytes.[3] Dado que Unicode limita los puntos de código a los 17 planos que pueden ser codificados por UTF-16, los puntos de código por encima de 0x10FFFF no son válidos en UTF-8 y UTF-32.

Así que puedes ver que puedes poner cosas en UTF-8 que no son Unicode válidas. ¿Por qué? Porque UTF-8 admite puntos de código que Unicode ni siquiera admite.

UTF-8, incluso con cuatro bytes limitación, soportes 221 puntos de código, que es mucho más que 17 * 2^16

 6
Author: Evan Carroll,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-13 07:35:30

UTF-8 es una longitud variable que codifica con un mínimo de 8 bits por carácter.
Los caracteres con puntos de código más altos tomarán hasta 32 bits.

 4
Author: deceze,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-04-19 13:35:11

Cita de Wikipedia: "UTF-8 codifica cada uno de los 1.112.064 puntos de código en el conjunto de caracteres Unicode utilizando de uno a cuatro bytes de 8 bits (denominados "octetos" en el Estándar Unicode)."

Algunos enlaces:

 3
Author: ZZ-bb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-04-19 13:35:18

Consulte el estándar Unicode y la información relacionada, como su entrada de preguntas frecuentes, UTF-8 UTF-16, UTF-32 & BOM. No es que la navegación suave, pero es información autorizada, y mucho de lo que podría leer sobre UTF-8 en otros lugares es cuestionable.

El "8" en "UTF-8" se refiere a la longitud de unidades de código en bits. Las unidades de código son entidades que se utilizan para codificar caracteres, no necesariamente como una simple asignación de uno a uno. UTF-8 utiliza un número variable de unidades de código para codificar caracter.

La colección de caracteres que se pueden codificar en UTF-8 es exactamente la misma que para UTF-16 o UTF-32, es decir, todos los caracteres Unicode. Todos codifican todo el espacio de codificación Unicode, que incluso incluye no caracteres y puntos de código no asignados.

 2
Author: Jukka K. Korpela,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-04-19 14:25:54

Si bien estoy de acuerdo con mpen en los códigos UTF-8 máximos actuales (2,164,864) (enumerados a continuación, no pude comentar sobre el suyo), está apagado por 2 niveles si elimina las 2 restricciones principales de UTF-8: solo 4 bytes límite y los códigos 254 y 255 no se pueden usar (solo eliminó el límite de 4 bytes).

El código de inicio 254 sigue la disposición básica de los bits de inicio (bandera de varios bits establecida en 1, una cuenta de 6 1's, y terminal 0, sin bits de repuesto) que le da 6 bytes adicionales para trabajar con (6 grupos 10xxxxxx, otros 2^36 códigos).

El código de inicio 255 no sigue exactamente la configuración básica, no hay terminal 0 pero se usan todos los bits, lo que le da 7 bytes adicionales (bandera de varios bits establecida en 1, un recuento de 7 1's, y no hay terminal 0 porque se usan todos los bits; 7 10xxxxxx grupos, 2^42 códigos adicionales).

Al agregar estos, se obtiene un conjunto de caracteres presentables máximo final de 4,468,982,745,216. Esto es más que todos los caracteres en uso actual, idiomas antiguos o muertos, y cualquier creído perdido idioma. Angelical o Celestial script alguien?

También hay códigos de un solo byte que se pasan por alto/se ignoran en el estándar UTF-8, además de 254 y 255: 128-191, y algunos otros. Algunos son utilizados localmente por el teclado, el código de ejemplo 128 es generalmente un retroceso de eliminación. Los otros códigos iniciales (y rangos asociados) no son válidos por una o más razones ( https://en.wikipedia.org/wiki/UTF-8#Invalid_byte_sequences).

 1
Author: James V. Fields,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-14 22:43:11