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