Estoy preguntando por el recuento de todas las posibles combinaciones válidas en Unicode con explicación.
1,111,998 : 17 planos × 65,536 caracteres por plano - 2048 sustitutos - 66 no personajes
Tenga en cuenta que, en teoría, UTF-8 y UTF-32 podrían codificar mucho más de 17 planos, pero el rango está restringido en función de las limitaciones de la codificación UTF-16 .
137,929 puntos de código están realmente asignados en Unicode 12.1 .
Tampoco entiendo por qué los bytes de continuación tienen restricciones a pesar de que el byte inicial de ese carácter borra cuánto tiempo debería ser.
El propósito de esta restricción en UTF-8 es hacer que la codificación se sincronice automáticamente .
Como contraejemplo, considere la codificación china GB 18030 . Allí, la letra ß
se representa como la secuencia de bytes 81 30 89 38
, que contiene la codificación de los dígitos 0
y 8
. Entonces, si tiene una función de búsqueda de cadenas no diseñada para esta peculiaridad específica de la codificación, una búsqueda del dígito 8
encontrará un falso positivo dentro de la letra ß
.
En UTF-8, esto no puede suceder, porque la no superposición entre los bytes iniciales y los bytes finales garantiza que la codificación de un carácter más corto nunca pueda ocurrir dentro de la codificación de un carácter más largo.
Unicode permite 17 planos , cada uno de los 65.536 caracteres posibles (o 'puntos de código'). Esto da un total de 1,114,112 caracteres posibles. En la actualidad, solo se ha asignado alrededor del 10% de este espacio.
Los detalles precisos de cómo se codifican estos puntos de código difieren con la codificación, pero su pregunta hace que parezca que está pensando en UTF-8. La razón de las restricciones en los bytes de continuación es presumiblemente que es fácil encontrar el comienzo del siguiente carácter (ya que los caracteres de continuación siempre tienen el formato 10xxxxxx, pero el byte de inicio nunca puede ser de este formato).
fuente
Unicode admite 1,114,112 puntos de código. Hay 2048 puntos de código sustitutos, lo que da 1,112,064 valores escalares. De estos, hay 66 no caracteres, lo que lleva a 1,111,998 caracteres codificados posibles (a menos que haya cometido un error de cálculo).
fuente
Para dar una respuesta precisa metafóricamente,
all of them
.Los bytes de continuación en las codificaciones UTF-8 permiten la resincronización del flujo de octetos codificados frente al "ruido de línea". El codificador, simplemente necesita escanear hacia adelante en busca de un byte que no tenga un valor entre 0x80 y 0xBF para saber que el siguiente byte es el comienzo de un nuevo punto de carácter.
En teoría, las codificaciones que se utilizan hoy en día permiten la expresión de caracteres cuyo número de caracteres Unicode es de hasta 31 bits de longitud. En la práctica, esta codificación se implementa en servicios como Twitter, donde el tweet de longitud máxima puede codificar hasta 4.340 bits de datos. (140 caracteres [válidos y no válidos], multiplicados por 31 bits cada uno).
fuente
perl -le 'print ord "\x{1FFF_FFFF_FFFF}"'
imprime 35184372088831 en una máquina de 64 bits, pero da un desbordamiento de enteros en una máquina de 32 bits. Puede utilizar caracteres más grandes, como que dentro de su programa de Perl, pero si se intenta imprimir en papel como UTF-8, se obtiene una advertencia obligatoria a menos que tales desactivar:perl -le 'print "\x{1FFF_FFFF}"' Code point 0x1FFFFFFF is not Unicode, may not be portable at -e line 1. ######
. Hay una diferencia entre "UTF8 suelto" y "UTF-8 estricto": el primero no está restringido.len(chr(0x10000))
, dando 2 (unidades de código). El kernel de OS X usa UTF-8, correcto, pero las API de alto nivel (Cocoa, etc.) usan UTF-16.[𝒜-𝒵]
, y verá por qué encuentro que exponer UTF-16 es un fracaso. Es un error hacer que los programadores piensen en formas de codificación en lugar de en caracteres lógicos.Unicode tiene la cantidad hexadecimal de 110000, que es 1114112
fuente
Según Wikipedia , Unicode 12.1 (lanzado en mayo de 2019) contiene 137.994 caracteres distintos.
fuente