Como determinar quantos caracteres Unicode pode armazenar
Unicode pode armazenar 1.111.998 caracteres.
Para saber o porquê, precisamos olhar para a história do Unicode e definições técnicas do que é e do que não é um personagem.
No final dos anos 80, Unicode começou como uma codificação de 16 bits para suportar todas as linguagens vivas do mundo, contrastando com a já consagrada codificação ASCII de 8 bits que só era quase suficientemente boa para uma ou duas linguagens.
Para citar Unicode 88, de Joseph D. Becker,
Unicode tem a intenção de abordar a necessidade de uma codificação de texto do mundo funcional e confiável. Unicode pode ser descrito grosso modo como "ASCII de corpo largo" que foi esticado para 16 bits para englobar os caracteres de todas as línguas vivas do mundo's. Em um design apropriadamente projetado, 16 bits por caractere são mais que suficientes para este propósito.
Neste ponto, Unicode era tanto um índice de caracteres quanto um esquema de codificação - uma codificação de dois bytes que mais tarde foi chamada UCS-2, à medida que outras codificações surgiram.
Como sabemos hoje, 16 bits ([matemática]65,536[/math] valores) não foi suficiente e o padrão Unicode já tem muito mais caracteres atribuídos, e ainda crescendo.
Source: Unicode e Rust, behnam/rust-unic.
Quando se expandiu Unicode em meados da década de 90, já havia muitos sistemas implementados UCS-2 e era tarde demais para mudá-los.
Fun fact #1: Tais sistemas incluem quase todas as linguagens de programação populares usadas hoje em dia: C++, Python, Java, Javascript, Ruby, e PHP. (C# veio mais tarde, mas teve que ficar perto de Win32 e Java; um efeito em cascata.)
Por isso, a expansão foi projetada para permanecer compatível com os sistemas UCS-2, permitindo que parte dos pontos de código Unicode fossem usados para codificar valores maiores que [matemática]65,535[/math]. Após considerar várias opções, o corpo padrão Unicode aterrissou no que conhecemos hoje como o esquema de codificação chamado UTF-16, o 16-bit Unicode Transformation Format.
O espaço de código do UTF-16 pode suportar pontos de código até : [matemática]17 × 2^{16} - 1 = 1.114.111[/math] (que é [matemática]10FFFF_{16}[/math]).
UTF-8 foi inventado mais tarde, com espaço para muito mais caracteres do que o UTF-16 permitido. Mas, como o UTF-16 é parte integrante de muitas tecnologias importantes, o Unicode Consortium decidiu fixar o tamanho do espaço de código do Unicode para o que é suportado pelo UTF-16, que é o menor que o tamanho do UTF-8 e UTF-32.
mas, espere! [matemática]17 × 2^{16} = 1.114.112[/math] não pode ser a resposta final, pois tivemos que sacrificar alguns pontos de código no UCS-2 para podermos codificar pontos de código até o inteiro [matemática]1.114.111[/math]. Estes pontos de código são chamados de Pares de Substituição, divididos em dois grupos:
- High-Surrogate Code Unit, no intervalo U+D800 a U+DBFF ([matemática]2^{10} = 1024[/math] code points), e
- Low-Surrogate Code Unit, no intervalo U+DC00 a U+DFFF (outro [matemática]2^{10} = 1024[/math] code points).
Por isso, esses pontos de código não podem nunca se tornar um personagem real. (Dizemos real, porque sistemas mais antigos, como os sistemas de arquivos no Windows e MacOS, os vêem como caracteres.)
O novo espaço de código que temos depois desta exclusão é chamado Unicode Scalar Value. O tamanho deste espaço é: [matemática]17 × 2^{16} - 2 × 2^{10} = 1.112.064[/math].
Fato Divertido #2: Aqui você pode ver o benefício das linguagens de programação modernas, como Rust e Swift, que fazem sua definição de caracteres baseada em Unicode Scalar Values.
Só estaríamos prontos agora, se o tamanho dos Scalar Values fosse a questão. Mas, você perguntou "quantos caracteres" Unicode pode armazenar, então ainda temos mais uma coisinha a considerar.
Por definição Unicode, há alguns pontos de código (ou valores escalares) colocados de lado para nunca serem atribuídos como um caractere. Estes pontos de código são chamados de Noncharacter, e existem para serem usados por software internamente, mas nunca armazenados ou transmitidos como parte do texto.
Para citar o Glossário de Unicode, um Noncharacter é:
Um ponto de código que é permanentemente reservado para uso interno. Noncharacters consistem nos valores U+nFFFE e U+nFFFFFF (onde n é de [matemática]0[/math] a [matemática]10_{16}[/math]), e os valores U+FDD0..U+FDEF.
>É outro ponto de código [matemática]66[/math] que nunca pode se tornar um caractere. Unicode estabilizou o número de não-caracteres e este conjunto nunca vai mudar.
Com isto, chegamos à resposta final, ou seja: [matemática]17 × 2^{16} - 2 × 2^{10} - 66 = 1.111.998[/math].
Sai deste código [matemática]1.111.998[/math] pontos, alguns são reservados para uso privado. Estes pontos de código nunca serão atribuídos como um caractere pelo Unicode Consortium. Mas, em conformidade com o padrão Unicode, eles podem ser atribuídos como um "Unicode character" em um sistema com suporte completo para Unicode.
Por causa disso, estou considerando os caracteres de Uso Privado incluídos nos números e paramos de descontar aqui!
Artigos semelhantes
- Como criar uma senha com 8 caracteres incluindo 1 letra maiúscula, 1 caractere especial e caracteres alfanuméricos
- O que faz a ISO 100, 200, 400, etc. em câmaras e fotografia e porque se chama ISO e não RFC, IETF, IEEE, ANSI ou Unicode?
- Quantos caracteres estão representados em um teclado QWERTY em inglês americano?
- Como o IRS pode determinar que eu tenha rendimentos de aluguer não declarados?