O mínimo que todo programador deveria saber de encoding e charset
Tags: codenewbie, computerscience, beginners, programming
Published: 2023-04-25 15:07:29

Acredito que todo mundo aqui já deve ter passado por algum problema de encoding, seja trabalhando com strings no Python, seja tipo de dados num DB, seja gerando arquivos, integrando com outros sistemas, etc

Maioria das vezes dá pra resolver jogando o erro no stackoverflow?

- Dá!

Mas a questão é que nos casos em que não dá, ou que fica muito mais difícil resolver se você fez cagada, tipo charset e type no db, ai é melhor você saber o que está fazendo desde o começo.

# Começando do começo

Isso parece o básico, mas vamos relembrar mesmo assim, um computador saber trabalhar com bits, 0 - 1 (não precisa saber disso, mas basicamente é por conta de transistores e tem corrente elétrica ou não, mas isso é assunto pra dolorosa faculdade de Engenharia da Comp).

Logo, na memória do seu pczim não tem la a string “SAVE ME”, ele guarda bits, usualmente representados como 011001, algo do gênero, para que esses bits tenham algum significado precisamos converter esses bits em algo, tipo usando uma tabela de conversão e esse processo chamamos de “encoding”.

OBS: “save me” pq é o nome da musica que eu estava ouvindo kkkk, não que seja uma mensagem subliminar ou algo do gênero, risos.

Um dos esquemas de encoding mais utilizado e aceito é o ASCII, onde um trecho da tabela segue na imagem abaixo:

![ASCII Table](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fjy9nteqbff7lck7rvxp.jpeg)

# Termos necessários

## charset ou character set

é o conjunto de caracteres ou símbolos/letras que podem ser representados por um determinado processo de encoding, vez ou outra é usado de maneira intercambiável com encoding.

## string

um conjunto de items juntos, uma bit string é algo como 0101010111, character string é algo como “hello world”.

## Binario, Hex (hexadecimal), Decimal

Existem diversas formas de representar números, da matemática chamamos de sistema de numeração, que basicamente forma os algarismos e a organização de sua representação.

Por exemplo, no binário utilizamos somente 0 e 1, logo, pra representar o algarismo 2 precisamos utilizar 10 (que não significa dez, assim como no sistema decimal e sim 2).

No Hexadecimal temos 16 algarismo, logo 0 - 9 e seguindo com A - F, onde A = 10 e F = 15, logo 10 = 16 no hexadecimal (um zero representa 16).

# Qual a “tabela” mais utilizada?

Como entendemos que char set nada mais é que uma tabela de correspondência entre bits e letras (carácteres), da para imaginar que ao longo da história tivemos diversas tabelas criadas, algumas mais específicas, para idiomas como chinês, japonês, etc, e outras mais abrangentes, envolvendo múltiplos idiomas.

Um dia, alguém teve a brilhante ideia de “unificar” todas essas tabelas, daí surgiu o Unicode, que não é um encoding (dafuck?). Sim, o unicode define code points (conversões de números para chars), porém como esses code points são transformados em bits é um tópico a parte. Pense da seguinte forma, essa tabela é gigantona, logo, se você não precisa utilizar todos os carácteres presentes (tipo chinês ou klingon), seria um desperdício de espaço guardar chars com 4 bytes que poderiam facilmente ser 1 ou 2.

## Então qual é o encoding mais utilizado para transformar o Unicode?

É ai que entra o UTF e suas variações, basicamente o UTF possui algoritmos para esse trabalho, UTF-32 usa 4 bytes por caractere, o que na maioria dos casos vai desperdiçar muito espaço. UTF-8 é um encoding de tamanho variável, onde ele vai utilizar o menor tamanho de byte possível pra representar um caractere, utilizando o primeiro byte para representar quantos bytes existem na sequência, chamado de *leader byte*, os bytes restantes (se forem necessários) são chamados de *trailing bytes*. UTF-8 é uma ótima escolha em geral, porém pode desperdiçar espaço caso o leader byte seja utilizado com frequência (ou seja, fora do ASCII). Existe também o UTF-16 que está no meio do caminho e pode ser utilizado pra otimizar caso faça sentido.

## Misc de code points Unicode

Quem nunca abriu a tabela de Unicode do Windows pra copiar aquele emoji text não é mesmo?

¯\\_(ツ)_/¯

Code points Unicode são escritos em hexadecimal (para manter os números menores), sempre precedidos por “U+” (somente um identificador para dizer “isto aqui é Unicode)

Por exemplo, U+1F975 é o emoji pra pimenta em Unicode **🥵** (sim é pimenta, seus pervertidos).

Isso quer dizer que ele é o caractere número 129397 da tabela.

# Last words

E por hoje é isso pessoal, agora não tem motivo pra não saber lidar com encodings ein, principalmente quando for gerar uma coluna nova no DB hahaha.
Ahh sim, falando em DB ainda existe o conceito de Collation (basicamente dita como os dados são ordenados, acentos, diferenciação entre letras maiúsculas e minúsculas, etc). Mas ai fica pra uma próxima ocasião, afinal vale um artigo por si só.