Unicode. O essencial que todo programador deveria saber - UTF-8, ASCII e Emojis
Motivação
Passando algum tempo no facebook é possível ver que algumas pessoas têm a capacidade de mudar os estilos das fontes nos seus posts - algo que me surpreendeu totalmente - mas por alguma razão, não é possível fazer o mesmo copiando um texto de um processador de texto(Word, Writer, Google Docs) com fontes estilizadas e tamanhos específicos de um lado para outro; o que me levou a uma procura de 5h de estudo sobre o funcionamento dos textos nos computadores.
O princípio
Bem lá a atrás quando o homem escrevia nas pedras ele teve a necessidade... Ok, talvez eu tenha ido muito atrás. Lá no início do desenvolvimento dos computadores e com a sua evolução passou a ser possível armazenar dados que por sua vez precisavam ser representados numa forma que era legível para humanos, e para isso foram criados padrões de textos que representavam certos valores com um código numérico, sendo o ASCII que se tornou o padrão Americano( nem preciso dizer que era em inglês).
ASCII
ASCI, traduzido como Padrão Americano para Intercâmbio de Informação é um sistema de representação de letras, algarismos e sinais de pontuação e de controle, através de um sinal codificado em forma de código binário (cadeias de bits formada por vários 0 e 1), desenvolvido a partir de 1960, que representa um conjunto de 128 sinais: 95 sinais gráficos (letras do alfabeto latino, algarismos arábicos, sinais de pontuação e sinais matemáticos) e 33 sinais de controle, utilizando 7 bits para representar todos os seus símbolos. Este padrão serviu perfeitamente por muito tempo já que os que maior mercado de computadores estava lá nos EUA, e era presente em linguagens de programação muito fortes na época como a linguagem C. Na época os computadores eram na maioria 8 bits o que significa que era possível chegar até 256 combinações par códigos, mas já que o padrão ASCII usava 128 códigos, sobravam ainda outros 128 códigos possíveis.
O problema
Como já dito, ainda existia a possibilidade de usar 128 códigos livremente de acordo a vontade do fabricamente. Com o tempo computadores passaram a ser vendidos fora da América, e os códigos restantes passaram a ser adequados para fazer a representação de carácteres conforme o seu país que com o tempo foram chamados de code pages. Tudo isso era uma maravilha, já que cada país tinha seus próprios caractéres e contando que ninguém enviasse um texto para alguém de outro país tudo ficaria bem... até que a internet veio :) - o que significa literalmente fogo no parquinho.
Para exemplificar imaginemos que os caractéres acima de 127 representem letras do portugês:
á, é, í, ó. O que faria elas correspondentes a: 128,129,130 e 131 respectivamente.
Mas num outro país os números 128,129,130 e 131 fossem:
ぁ あ さ と ぺ respectivamente.
O computador era obrigado a mandar estes dados em binário e ao decodificar o destinatário recebia uma mensagem totalmente diferente da enviada, o que geraria uma confusão e tanto.
Unicode - a luz no fim do tunel
O unicode foi uma iniciativa inteligente de tentar criar um sistema global para a representação de carácteres. Ele representa os carácteres como uma versão ideal deles que podem ser mapeados para diferentes tipos de fontes como Times New Roman, Arial,etc e ainda assim continuarem a ser as mesmas letras de maneira individual, sem acréscimos de memória. O unicode é representado por 'U+' e 4 valores em Hexadecimal. Por exemplo, a representação de "Hello" em unicode seria:
U+0048 U+0065 U+006C U+006C U+006F.
Apesar do total de bits ser 16 o que resulta em 65,356 carateres, este não é o limite do unicode, na verdade ele não tem limites porque ele pode se expandir( e diminuir) conforme a necessidade.
Codificação
Um dos problemas que se teve na codificação era o Endianess - a forma como os bytes são lidos podendo ser little endian ou big endian - mas foi resolvido com a colocação de prefixos FE FF que definiam a forma como os bytes deveriam ser lidos de acordo a máquina.
Outro problema era o uso de memória já que para aqueles que falam inglês apenas 8 bits eram necessários já que os primeiros caracteres do unicode são os mesmos que o do ASCII então seria desnecessário reservar 16 bits disperdiçando memória. Daí surgiu a necessidade do UTF-8 onde o 8 representa o número de bits por caracter unicode. Então, na realidade o unicode não é um tipo de codificação e sim um mapeamento para carateres sendo as codificações UTF-8, UTF-16, UCS-2, etc.
A resposta ao questionamento
Então porquê que eu não consigo colocar as fontes que quero no facebook mas posso estilizar textos como esses:
𝕰𝖝𝖊𝖒𝖕𝖑𝖔
ℰ𝓍ℯ𝓂𝓅𝓁ℴ
𝔈𝔵𝔢𝔪𝔭𝔩𝔬
𝔢𝔵𝔢𝔪𝔭𝔩𝔬
E agora as suas representações em unicode, respectivamente:
U+1D570 U+1D59D U+1D58A U+1D592 U+1D595 U+1D591 U+1D594
U+2130 U+1D4CD U+212F U+1D4C2 U+1D4C5 U+1D4C1 U+2134
U+1D508 U+1D535 U+1D522 U+1D52A U+1D52D U+1D529 U+1D52C
U+1D522 U+1D535 U+1D522 U+1D52A U+1D52D U+1D529 U+1D52C
A verdade é que estes textos não são "fontes de verdade" e sim representações unicode que estão presentes internamente em todos os dispositivos, razão pela qual é possível que elas são facilmente representadas. A forma mais fácil de pensar nelas é como se fossem emojis, que não passam de pictographs que todo mundo tem internamente armazenado nos seus smartphones. Fontes de textos são arquivos que contêm um conjunto de caracteres mapeados pelo unicode, razão pela qual em programação é preciso linkar uma fonte externa
'https://fonts.googleapis.com/css?family=Sofia'
rel='stylesheet' />
para que o navegador consiga entendá-la, porque naquele escopo do arquivo html retornado a fonte que você quer colocar não existe.
Conclusão
Na verdade não existe tal coisa como "plain text" tudo são arquivos binários, mas os textos particularmente são interpretados de primeira como arquivos a serem visualizados de forma amigável. O unicode é a razão pela qual você pode estar aí sentado no seu smartphone e comentar neste artigo: fino senhores 🗿 🍷
Sugestões
Se você gostou do artigo considere seguir as minhas redes sociais: Youtube:CgSnakeDev Linkedin:Cristino Canga
Links de sites para você brincar com unicode
https://r12a.github.io/app-conversion/ https://cryptii.com/pipes/text-decimal https://onlineunicodetools.com/convert-unicode-to-code-points https://www.unicodetextconverter.net
Fontes
https://pt.wikipedia.org/wiki/Unicode
https://nedbatchelder.com/text/unipain.html
https://www.babelstone.co.uk/Unicode/text.html
https://pt.wikipedia.org/wiki/Unicode
https://nedbatchelder.com/text/unipain.html
https://www.babelstone.co.uk/Unicode/text.html
https://pt.wikipedia.org/wiki/ASCII
Parabéns pelo artigo, achei muito legal.
Há 2 pontos que eu queria destacar:
Primeiro que vc disse que um caracter Unicode é representado pelo "U+" seguido por 4 digitos, mas na verdade é por até 6 digitos porque o code space do Unicode vai até U+10FFFF.
O segundo ponto é que vc diz que o Unicode não tem limites e que pode se expandir conforme a necessidade.
Acontece que há um limite que é 1.114.112! E destes mais de 1 milhão de code points, apenas 149.186 são usados atualmente na vesão 15.0 do Unicode.
Fonte: https://www.unicode.org/versions/Unicode15.0.0/ch01.pdf
Muito bom o post, deu pra entender legal o conceito de baixo nivel, sendo programador front-end, acabei de ter uma pespectiva melhor sobre as importações e como os navegadores interpretam e interagem com o sistema para renderização, muito obrigado pelo post!
Muito bom post, sempre uso a tabela Ascii em projetos de baixo nivel, mas o unicode é algo universal nos dias de hoje. Inclusive tinha lido em algum lugar que o criador original tava aprendendo git, pra subir o código original no github.
Naquele tempo nós até decorávamos alguns caracteres ASC, alguns ainda lembro até hoje.
Poxa, entrei achando que teria alguma menção ao emojipedia hahah. Mas bacana o post, é sempre interessante e importante esse tipo de conteúdo, hoje ainda utilizo algumas coisas com o código unicode para ter certeza que o navegador irá interpretar o que eu