Estou um pouco confuso sobre codificações. Até onde eu sei, os caracteres ASCII antigos usavam um byte por caractere. Quantos bytes um caractere Unicode requer?
Presumo que um caractere Unicode possa conter todos os caracteres possíveis de qualquer idioma - estou correto? Então, quantos bytes ele precisa por caractere?
E o que significa UTF-7, UTF-6, UTF-16 etc.? São versões diferentes do Unicode?
Eu li o artigo da Wikipedia sobre Unicode, mas é bastante difícil para mim. Estou ansioso para ver uma resposta simples.
Respostas:
Você não verá uma resposta simples porque não há uma.
Primeiro, o Unicode não contém "todos os caracteres de todos os idiomas", embora com certeza tente.
O próprio Unicode é um mapeamento, define pontos de código e um ponto de código é um número, geralmente associado a um caractere. Eu digo geralmente porque existem conceitos como combinar personagens. Você pode estar familiarizado com coisas como sotaques ou trema. Esses podem ser usados com outro caractere, como um
a
ou a,u
para criar um novo caracter lógico. Um caractere, portanto, pode consistir em 1 ou mais pontos de código.Para ser útil em sistemas de computação, precisamos escolher uma representação para essas informações. Essas são as várias codificações unicode, como utf-8, utf-16le, utf-32 etc. Elas se distinguem principalmente pelo tamanho de suas unidades de código. UTF-32 é a codificação mais simples, possui uma unidade de código de 32 bits, o que significa que um ponto de código individual se encaixa confortavelmente em uma unidade de código. As outras codificações terão situações em que um ponto de código precisará de várias unidades de código, ou esse ponto de código específico não poderá ser representado na codificação (este é um problema, por exemplo, com o UCS-2).
Devido à flexibilidade de combinar caracteres, mesmo dentro de uma determinada codificação, o número de bytes por caractere pode variar dependendo do caractere e da forma de normalização. Este é um protocolo para lidar com caracteres que possuem mais de uma representação (você pode dizer
"an 'a' with an accent"
quais são 2 pontos de código, um dos quais é um caractere de combinação ou"accented 'a'"
qual é um ponto de código).fonte
Estranhamente, ninguém apontou como calcular quantos bytes estão usando um caractere Unicode. Aqui está a regra para cadeias codificadas em UTF-8:
Portanto, a resposta rápida é: são necessários 1 a 4 bytes, dependendo do primeiro, que indicará quantos bytes serão necessários.
fonte
Sei que esta pergunta é antiga e já tem uma resposta aceita, mas quero oferecer alguns exemplos (esperando que seja útil para alguém).
Certo. Na verdade, como o ASCII é uma codificação de 7 bits, ele suporta 128 códigos (95 dos quais são imprimíveis); portanto, ele usa apenas meio byte (se isso faz algum sentido).
Unicode apenas mapeia caracteres para pontos de código. Ele não define como codificá-los. Um arquivo de texto não contém caracteres Unicode, mas bytes / octetos que podem representar caracteres Unicode.
Não. Mas quase. Então basicamente sim. Mas ainda não.
O mesmo que sua segunda pergunta.
Não, essas são codificações. Eles definem como bytes / octetos devem representar caracteres Unicode.
Alguns exemplos. Se alguns deles não puderem ser exibidos no seu navegador (provavelmente porque a fonte não os suporta), vá para
http://codepoints.net/U+1F6AA
(substitua1F6AA
pelo código em hexadecimal) para ver uma imagem.a
©
®
ጷ
—
‰
€
™
☃
☎
☔
☺
⚑
⚛
✈
✞
〠
肉
💩
🚀
Ok, eu estou me empolgando ...
Curiosidades:
fonte
00A9
preferivelmente em vez de00 A9
(que seria UTF-16BE).Simplesmente falar
Unicode
é um padrão que atribui um número (chamado ponto de código) a todos os caracteres do mundo (ainda está em andamento).Agora você precisa representar esses pontos de código usando bytes, chamados
character encoding
.UTF-8, UTF-16, UTF-6
são maneiras de representar esses personagens.UTF-8
é uma codificação de caracteres multibyte. Os caracteres podem ter de 1 a 6 bytes (alguns deles podem não ser necessários no momento).UTF-32
cada caractere possui 4 bytes por caractere.UTF-16
usa 16 bits para cada caractere e representa apenas parte dos caracteres Unicode chamados BMP (para todos os efeitos práticos, basta). Java usa essa codificação em suas cadeias.fonte
Em UTF-8:
Em UTF-16:
Em UTF-32:
10FFFF é o último ponto de código unicode por definição, e é definido dessa maneira porque é o limite técnico do UTF-16.
É também o maior ponto de código que o UTF-8 pode codificar em 4 bytes, mas a idéia por trás da codificação do UTF-8 também funciona para codificações de 5 e 6 bytes para cobrir pontos de código até 7FFFFFFF, ou seja. metade do que UTF-32 pode.
fonte
No Unicode, a resposta não é fácil. O problema, como você já apontou, são as codificações.
Dada qualquer sentença em inglês sem caracteres diacríticos, a resposta para UTF-8 seria de tantos bytes quanto caracteres e para UTF-16 seria o número de caracteres vezes dois.
A única codificação em que (a partir de agora) podemos fazer a declaração sobre o tamanho é UTF-32. Sempre há 32 bits por caractere, embora eu imagine que os pontos de código estejam preparados para um futuro UTF-64 :)
O que a torna tão difícil são pelo menos duas coisas:
U+20AC
pode ser representada quer como três bytes sequênciaE2 82 AC
ou quatro bytes sequênciaF0 82 82 AC
.fonte
Existe uma ótima ferramenta para calcular os bytes de qualquer string no UTF-8: http://mothereff.in/byte-counter
Atualização: @mathias tornou público o código: https://github.com/mathiasbynens/mothereff.in/blob/master/byte-counter/eff.js
fonte
Bem, eu também peguei a página da Wikipedia e, na parte de introdução, vi "Unicode pode ser implementado por diferentes codificações de caracteres. As codificações mais usadas são UTF-8 (que usa um byte para qualquer caractere ASCII, que possui os mesmos valores de código na codificação UTF-8 e ASCII e até quatro bytes para outros caracteres), o agora obsoleto UCS-2 (que usa dois bytes para cada caractere, mas não pode codificar todos os caracteres no atual padrão Unicode) "
Como esta citação demonstra, seu problema é que você está assumindo que Unicode é uma maneira única de codificar caracteres. Na verdade, existem várias formas de Unicode e, novamente nessa citação, uma delas tem até 1 byte por caractere, exatamente como você está acostumado.
Portanto, sua resposta simples que você deseja é que ela varie.
fonte
Para UTF-16, o caractere precisa de quatro bytes (duas unidades de código) se iniciar com 0xD800 ou superior; esse personagem é chamado de "par substituto". Mais especificamente, um par substituto tem a forma:
onde indica [...] uma unidade de código de dois bytes com o intervalo especificado. Qualquer coisa <= 0xD7FF é uma unidade de código (dois bytes). Qualquer coisa> = 0xE000 é inválido (exceto marcadores de lista técnica, sem dúvida).
Consulte http://unicodebook.readthedocs.io/unicode_encodings.html , seção 7.5.
fonte
Confira este conversor de código Unicode . Por exemplo, digite
0x2009
, onde 2009 é o número Unicode para espaço reduzido , no campo "0x ... notação" e clique em Converter. O número hexadecimalE2 80 89
(3 bytes) aparece no campo "UTF-8 code units".fonte
Do Wiki:
Estas são as três codificações diferentes mais populares.
fonte
Unicode
é um padrão que fornece um número único para cada caractere. Esses números únicos são chamadoscode point
s (que é apenas um código único) para todos os caracteres existentes no mundo (alguns ainda precisam ser adicionados).Para propósitos diferentes, você pode precisar representá-lo
code points
em bytes (a maioria das linguagens de programação o faz), e é aqui queCharacter Encoding
entra em ação.UTF-8
,UTF-16
,UTF-32
E assim por diante são todosCharacter Encodings
, e pontos de código de Unicode são representados nestes codificações, de diferentes maneiras.UTF-8
a codificação tem um comprimento de largura variável e os caracteres codificados nela podem ocupar 1 a 4 bytes, inclusive;UTF-16
possui um comprimento variável e os caracteres codificados podem ter 1 ou 2 bytes (8 ou 16 bits). Isso representa apenas parte de todos os caracteres Unicode chamados BMP (Basic Multilingual Plane) e é suficiente para quase todos os casos. Java usaUTF-16
codificação para suas strings e caracteres;UTF-32
possui comprimento fixo e cada caractere ocupa exatamente 4 bytes (32 bits).fonte