Se UTF-8 tiver 8 bits, isso não significa que pode haver no máximo 256 caracteres diferentes?
Os primeiros 128 pontos de código são iguais aos do ASCII. Mas diz que UTF-8 pode suportar até milhões de caracteres?
Como é que isso funciona?
Se UTF-8 tiver 8 bits, isso não significa que pode haver no máximo 256 caracteres diferentes?
Os primeiros 128 pontos de código são iguais aos do ASCII. Mas diz que UTF-8 pode suportar até milhões de caracteres?
Como é que isso funciona?
Respostas:
UTF-8 não usa um byte o tempo todo, é de 1 a 4 bytes.
Os primeiros 128 caracteres (US-ASCII) precisam de um byte.
Os próximos 1.920 caracteres precisam de dois bytes para codificar. Isso cobre o restante de quase todos os alfabetos latinos e também os alfabetos grego, cirílico, copta, armênio, hebraico, árabe, siríaco e tana, bem como as marcas diacríticas combinadas.
Três bytes são necessários para os caracteres no restante do plano multilíngue básico, que contém virtualmente todos os caracteres de uso comum [12], incluindo a maioria dos caracteres chineses, japoneses e coreanos [CJK].
Quatro bytes são necessários para caracteres em outros planos de Unicode, que incluem caracteres CJK menos comuns, vários scripts históricos, símbolos matemáticos e emoji (símbolos pictográficos).
fonte: Wikipedia
UTF-8 usa 1-4 bytes por caractere: um byte para caracteres ascii (os primeiros 128 valores Unicode são iguais a ascii). Mas isso requer apenas 7 bits. Se o bit mais alto ("sinal") for definido, isso indica o início de uma seqüência de bytes múltiplos; o número de bits altos consecutivos definido indica o número de bytes, então um 0, e os bits restantes contribuem para o valor. Para os outros bytes, os dois bits mais altos serão 1 e 0 e os 6 bits restantes serão para o valor.
Portanto, uma sequência de quatro bytes começaria com 11110 ... (e ... = três bits para o valor) e, em seguida, três bytes com 6 bits cada para o valor, resultando em um valor de 21 bits. 2 ^ 21 excede o número de caracteres Unicode, portanto, todos os Unicode podem ser expressos em UTF8.
De acordo com esta tabela, * UTF-8 deve suportar:
2 31 = 2.147.483.648 caracteres
No entanto, a RFC 3629 restringiu os valores possíveis, então agora estamos limitados a 4 bytes , o que nos dá
2 21 = 2.097.152 caracteres
Observe que uma boa parte desses caracteres são "reservados" para uso personalizado, o que é realmente muito útil para fontes de ícones.
* A Wikipedia usada mostra uma tabela com 6 bytes - desde então eles atualizaram o artigo.
11/07/2017: corrigido para contagem dupla do mesmo ponto de código codificado com bytes múltiplos
0xxxxxxx
dá 7 bits utilizáveis, 110xxxxx 10xxxxxx
dá mais 11 - não há sobreposição. O primeiro byte começa com 0
no primeiro caso e 1
no segundo caso.
00000001
armazena e o que 11000000 100000001
armazena?
Unicode resolve pontos de código em caracteres. UTF-8 é um mecanismo de armazenamento para Unicode. Unicode tem uma especificação. UTF-8 tem uma especificação. Ambos têm limites diferentes. UTF-8 tem um limite ascendente diferente.
Unicode é designado com "planos". Cada avião carrega 2 16 pontos de código. Existem 17 planos em Unicode. Para um total de 17 * 2^16
pontos de código. O primeiro plano, plano 0 ou BMP , é especial no peso do que carrega.
Em vez de explicar todas as nuances, deixe-me apenas citar o artigo acima sobre aviões.
Os 17 aviões podem acomodar 1.114.112 pontos de código. Destes, 2.048 são substitutos, 66 são não-personagens e 137.468 são reservados para uso privado, deixando 974.530 para atribuição pública.
Agora vamos voltar ao artigo com link acima,
O esquema de codificação usado por UTF-8 foi concebido com um limite muito maior de 2 31 pontos de código (32.768 planos), e pode codificar 2 21 pontos de código (32 aviões) mesmo se limitado a 4 bytes. [3] Como o Unicode limita os pontos de código aos 17 planos que podem ser codificados por UTF-16, os pontos de código acima de 0x10FFFF são inválidos em UTF-8 e UTF-32.
Então, você pode ver que pode colocar coisas em UTF-8 que não são Unicode válidas. Por quê? Porque UTF-8 acomoda pontos de código que o Unicode nem mesmo suporta.
UTF-8, mesmo com uma limitação de quatro bytes, suporta 2 21 pontos de código, o que é muito mais do que17 * 2^16
2.164.864 “caracteres” podem ser potencialmente codificados por UTF-8.
Este número é 2 ^ 7 + 2 ^ 11 + 2 ^ 16 + 2 ^ 21, que vem da maneira como a codificação funciona:
0xxxxxxx
Caracteres de 1 byte têm 7 bits para codificação
(0x00-0x7F)
Os caracteres de 2 bytes têm 11 bits para codificação
110xxxxx 10xxxxxx
(0xC0-0xDF para o primeiro byte; 0x80-0xBF para o segundo)
Os caracteres de 3 bytes têm 16 bits para codificação
1110xxxx 10xxxxxx 10xxxxxx
(0xE0-0xEF para o primeiro byte; 0x80-0xBF para bytes de continuação)
Os caracteres de 4 bytes têm 21 bits para codificação
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
(0xF0-0xF7 para o primeiro byte; 0x80-0xBF para bytes de continuação)
Como você pode ver, isso é significativamente maior do que o Unicode atual (1.112.064 caracteres).
ATUALIZAR
Meu cálculo inicial está errado porque não considera regras adicionais. Veja comentários a esta resposta para mais detalhes.
UTF-8 é uma codificação de comprimento variável com um mínimo de 8 bits por caractere.
Os caracteres com pontos de código mais altos levarão até 32 bits.
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
, portanto, apenas 21 bits podem ser usados para codificar o caractere real.
Citação da Wikipedia: "UTF-8 codifica cada um dos 1.112.064 pontos de código no conjunto de caracteres Unicode usando um a quatro bytes de 8 bits (denominados" octetos "no padrão Unicode)."
Alguns links:
Verifique o Padrão Unicode e as informações relacionadas, como sua entrada de FAQ, UTF-8 UTF-16, UTF-32 e BOM . Não é tão fácil, mas é uma informação confiável, e muito do que você pode ler sobre o UTF-8 em outro lugar é questionável.
O “8” em “UTF-8” refere-se ao comprimento das unidades de código em bits. Unidades de código são entidades usadas para codificar caracteres, não necessariamente como um mapeamento um-para-um simples. UTF-8 usa um número variável de unidades de código para codificar um caractere.
A coleção de caracteres que podem ser codificados em UTF-8 é exatamente a mesma que em UTF-16 ou UTF-32, ou seja, todos os caracteres Unicode. Todos eles codificam todo o espaço de codificação Unicode, que inclui até mesmo não caracteres e pontos de código não atribuídos.
Embora eu concorde com o mpen sobre os códigos UTF-8 máximos atuais (2.164.864) (listados abaixo, eu não poderia comentar sobre o dele), ele está errado por 2 níveis se você remover as 2 principais restrições do UTF-8: apenas 4 bytes limite e os códigos 254 e 255 não podem ser usados (ele apenas removeu o limite de 4 bytes).
O código inicial 254 segue o arranjo básico dos bits iniciais (sinalizador de vários bits definido como 1, uma contagem de 6 1's e terminal 0, sem bits sobressalentes), dando a você 6 bytes adicionais para trabalhar (6 grupos 10xxxxxx, 2 adicionais ^ 36 códigos).
O código inicial 255 não segue exatamente a configuração básica, nenhum terminal 0, mas todos os bits são usados, dando a você 7 bytes adicionais (sinalizador de vários bits definido como 1, uma contagem de 7 1's e nenhum terminal 0 porque todos os bits são usados ; 7 grupos 10xxxxxx, mais 2 ^ 42 códigos).
Adicioná-los dá um conjunto final máximo de caracteres apresentáveis de 4.468.982.745.216. Isso é mais do que todos os caracteres em uso atual, línguas antigas ou mortas e quaisquer línguas perdidas. Alguém com script angelical ou celestial?
Além disso, existem códigos de byte único que são negligenciados / ignorados no padrão UTF-8, além de 254 e 255: 128-191 e alguns outros. Alguns são usados localmente pelo teclado, o código de exemplo 128 é geralmente um backspace de exclusão. Os outros códigos iniciais (e intervalos associados) são inválidos por um ou mais motivos ( https://en.wikipedia.org/wiki/UTF-8#Invalid_byte_sequences ).
O Unicode é casado com o UTF-8. O Unicode oferece suporte especificamente para 2 ^ 21 pontos de código (2.097.152 caracteres), que é exatamente o mesmo número de pontos de código compatível com UTF-8. Ambos os sistemas reservam o mesmo espaço 'morto' e zonas restritas para pontos de código, etc. ... em junho de 2018, a versão mais recente, Unicode 11.0, contém um repertório de 137.439 caracteres
Do padrão Unicode. Unicode FAQ
O padrão Unicode codifica caracteres no intervalo U + 0000..U + 10FFFF, o que equivale a um espaço de código de 21 bits.
Da página UTF-8 da Wikipedia. Descrição UTF-8
Desde a restrição do espaço de código Unicode para valores de 21 bits em 2003, UTF-8 é definido para codificar pontos de código em um a quatro bytes, ...