Charset vs Codificação
Tags: javascript, beginners, webdev, programming
Published: 2021-10-25 05:02:49

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8h7j2lu5bq1bg992pjng.png)

Recentemente, com minha decisão de me dedicar de forma mais séria à programação, comecei a fazer alguns pequenos projetos com o que venho aprendendo. Qualquer um está convidado a ver uns poucos projetos no meu github (abaixo) que venho idealizando. 

https://github.com/TTTecnology

Aos poucos vou adicionando complexidade em novos projetos ou mexendo em projetos antigos para eles ficarem mais incrementados. Há alguns projetos realizados em C, porém são da época que eu estava reaprendendo a lógica (longa história para outro post rsrs...).

Enfim, como parte dessa decisão de levar a programação mais a sério, decidi também criar posts técnicos sobre o que venho aprendendo e utilizando em meus projetos. O mais recente publicado é um gerador de senhas aleatórias. Bem simples, mas com funcionalidades interessantes.

!['Gerador de senhas'](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fli08i0mb3r40qtxxpds.png)

A grande beleza desse gerador de senhas é o fato de que o algoritmo de geração de um caractere aleatório é muito simples: você precisa apenas de um método que gera um número aleatório, e este número tem que estar dentro de uma faixa numérica específica. Em Javascript, este método seria o seguinte:
```
Math.random()
```
De acordo com o MDN Docs:
>A função Math.random() retorna um número pseudo-aleatório no intervalo [0, 1[, ou seja, de 0 (inclusivo) até, mas não incluindo, 1 (exclusivo), que depois você pode dimensionar para um intervalo desejado

Ok, isso quer dizer que o número que será gerado está entre 0 e 1. Para colocar isso dentro de uma faixa numérica, é simples: basta somar o resultado da operação com o número mínimo, e multiplicar a amplitude dessa faixa pelo número gerado:
```
N * amplitude + mínimo
sendo
N = numero gerado aleatoriamente
```
O problema agora é: **Como descobrimos essa faixa numérica?**

Temos que entender a coisa mais básica sobre computadores: tudo o que tratamos no computador são números (especificamente coleções de 0 e 1, mas isso é assunto para outro post), então, a máquina diretamente não trata com letras.

Por lógica, podemos compreender que, uma letra terá um código específico que é processado pela máquina para ser mostrado como uma letra. Portanto, descrevendo o processo completo, a letra é representada como um número para a máquina que então é traduzida para uma coleção de zeros e uns. A este processo chamamos de **codificação**.

Essa associação entre letras e números, chamamos de **charset**. Em inglês simples, é a configuração de caracteres, onde cada caracter tem um código específico. 

Por exemplo, o charset mais antigo que conheço seria ASCII, utilizado pela linguagem C. Unicode, utilizado por Javascript, deriva desse charset, e, acreditem, é incrível, pois engloba até mesmo emojis (sim, estes que você utiliza no WhatsApp). Pra quem quiser dar uma olhada, a própria documentação do Unicode fornece a relação completa de emojis suportados, vale a pena conferir:

https://unicode.org/emoji/charts/full-emoji-list.html

Sabendo disso, precisamos saber quais números da tabela Unicode representam os caracteres que estamos buscando. Para simplificar as coisas, a w3schools nos fornece facilmente a tabela Unicode completa, mas o que nos interessa seria a sessão de caracteres latinos:

https://www.w3schools.com/charsets/ref_utf_basic_latin.asp

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gwzusw0un1slyt4jkkcz.png)

Então, verificando a tabela, é simples fazer a análise: os caracteres que precisamos estão na amplitude entre 33 a 126. Passando isso para nossa equação, temos o seguinte:
```
N * ( 126 + 1 - 33 ) + 33
```
Bom, por quê inclui nesse cálculo um **+1**? Simplesmente porque o número gerado aleatoriamente só vai até 0.99999999 (verificar a especificação acima). Para o algoritmo, utilizei o método de arredondamento para baixo, independente de onde caia o número. Então se o resultado for, por exemplo, 2.999999, o algoritmo irá arredondar para 2, mas isso é escolha do programador, o que irá mudar algumas parametrizações.

Então, ok. Conseguimos um jeito de calcular o número, como transformar ele em letra?

Através do método:
```
String.fromCharCode(inserirNumeroAqui)
```
Este método irá transformar qualquer número que for passado como parâmetro em uma correspondência em Unicode. Se for, por exemplo, 41, vai transformar o número na string "A".

Assim, conseguimos gerar caracteres aleatórios, mas para fazer senhas inteiras, aí será necessário um pouco de manipulação de arrays. Para colocar critérios de geração, aí são condicionais. Sinta-se livre para estudar o código completo abaixo ou fazer um algoritmo a sua maneira:

https://github.com/TTTecnology/Password-Generator