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 que UTF-8 puede admitir hasta un millón de caracteres?
¿Como funciona esto?
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 que UTF-8 puede admitir hasta un millón de caracteres?
¿Como funciona esto?
Respuestas:
UTF-8 no usa un byte todo el tiempo, es de 1 a 4 bytes.
fuente: Wikipedia
fuente
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 multibyte; el número de bits altos consecutivos establecidos 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.
Entonces, una secuencia de cuatro bytes comenzaría con 11110 ... (y ... = tres bits para el valor) luego tres bytes con 6 bits cada uno para el valor, dando un valor de 21 bits. 2 ^ 21 excede el número de caracteres Unicode, por lo que todo Unicode puede expresarse en UTF8.
fuente
Según esta tabla, * UTF-8 debería admitir:
2 31 = 2,147,483,648 caracteres
Sin embargo, RFC 3629 restringió los valores posibles, por lo que ahora tenemos un límite de 4 bytes , lo que nos da
2 21 = 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 muestra una tabla con 6 bytes; desde entonces han actualizado el artículo.
fuente
0xxxxxxx
da 7 bits utilizables,110xxxxx 10xxxxxx
da 11 más, no hay superposición. El primer byte comienza con0
en el primer caso y1
en el segundo.00000001
almacena y qué11000000 100000001
almacena?Unicode frente a UTF-8
Unicode resuelve los puntos de código en caracteres. UTF-8 es un mecanismo de almacenamiento para Unicode. Unicode tiene una especificación. UTF-8 tiene una especificación. Ambos tienen límites diferentes. UTF-8 tiene un límite ascendente diferente.
Unicode
Unicode se designa con "planos". Cada avión lleva 2 16 puntos de código. Hay 17 aviones en Unicode. Para un total de
17 * 2^16
puntos de código. El primer plano, el plano 0 o el BMP , es especial por el peso de lo que lleva.En lugar de explicar todos los matices, permítanme citar el artículo anterior sobre aviones.
UTF-8
Ahora volvamos al artículo vinculado anteriormente,
Entonces puede ver que puede poner cosas en UTF-8 que no son Unicode válido. ¿Por qué? Porque UTF-8 admite puntos de código que Unicode ni siquiera admite.
UTF-8, incluso con una limitación de cuatro bytes, admite 2 21 puntos de código, que es mucho más que
17 * 2^16
fuente
Se pueden codificar potencialmente 2,164,864 “caracteres” mediante UTF-8.
Este número es 2 ^ 7 + 2 ^ 11 + 2 ^ 16 + 2 ^ 21 que proviene de la forma en que funciona la codificación:
Los caracteres de 1 byte tienen 7 bits para la codificación
0xxxxxxx
(0x00-0x7F)Los caracteres de 2 bytes tienen 11 bits para la codificación
110xxxxx 10xxxxxx
(0xC0-0xDF para el primer byte; 0x80-0xBF para el segundo)Los caracteres de 3 bytes tienen 16 bits para la codificación
1110xxxx 10xxxxxx 10xxxxxx
(0xE0-0xEF para el primer byte; 0x80-0xBF para los bytes de continuación)Los caracteres de 4 bytes 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).
ACTUALIZAR
Mi cálculo inicial es incorrecto porque no considera reglas adicionales. Consulte los comentarios a esta respuesta para obtener más detalles.
fuente
UTF-8 es una codificación de longitud variable con un mínimo de 8 bits por carácter.
Los caracteres con puntos de código más altos ocuparán hasta 32 bits.
fuente
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
, por lo que solo se pueden usar 21 bits para codificar el carácter real.Cita de Wikipedia: "UTF-8 codifica cada uno de los 1.112.064 puntos de código en el juego de caracteres Unicode utilizando de uno a cuatro bytes de 8 bits (denominados" octetos "en el estándar Unicode)".
Algunos enlaces:
fuente
Consulte el estándar Unicode y la información relacionada, como su entrada de preguntas frecuentes, UTF-8 UTF-16, UTF-32 y BOM . No es tan fácil, 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 las 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 uno a uno. UTF-8 usa un número variable de unidades de código para codificar un carácter.
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.
fuente
Si bien estoy de acuerdo con mpen en los códigos UTF-8 máximos actuales (2,164,864) (que se enumeran a continuación, no pude comentar sobre el suyo), está fuera de 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, un recuento de 6 1 y terminal 0, sin bits de repuesto), lo que le brinda 6 bytes adicionales para trabajar (6 grupos 10xxxxxx, 2 ^ adicionales 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 (marca de múltiples bits establecida en 1, una cuenta de 7 1 y sin terminal 0 porque se usan todos los bits ; 7 grupos 10xxxxxx, 2 ^ 42 códigos adicionales).
Al agregarlos, se obtiene un conjunto de caracteres presentable 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 idioma perdido que se cree. ¿Alguien quiere un guión angelical o celestial?
También hay códigos de un solo byte que se pasan por alto / ignoran en el estándar UTF-8 además de 254 y 255: 128-191, y algunos otros. Algunos son usados localmente por el teclado, el código de ejemplo 128 suele ser un retroceso de eliminación. Los otros códigos de inicio (y rangos asociados) no son válidos por una o más razones ( https://en.wikipedia.org/wiki/UTF-8#Invalid_byte_sequences ).
fuente
Unicode está firmemente casado con UTF-8. Unicode admite específicamente 2 ^ 21 puntos de código (2,097,152 caracteres) que es exactamente la misma cantidad de puntos de código admitidos por UTF-8. Ambos sistemas reservan el mismo espacio 'muerto' y zonas restringidas para puntos de código, etc. ... a junio de 2018, la versión más reciente, Unicode 11.0, contiene un repertorio de 137,439 caracteres
Del estándar Unicode. Preguntas frecuentes sobre Unicode
De la página de Wikipedia de UTF-8. Descripción UTF-8
fuente