Olá, estudante! Seja bem-vindo(a) a mais uma lição da disciplina de Ciência da Computação! Em lições passadas, você aprendeu sobre os vários sistemas de numeração que existem, e agora é a hora de aprender sobre as suas aplicações.
Nesta lição, você verá alguns formatos de codificações que estão no nosso dia a dia e que muitas vezes não nos damos conta. Vamos lá?
Em lições passadas, você aprendeu sobre a ideia que sempre permeia tudo que está ligado à computação: Entrada → Processamento → Saída. Esse esquema é bastante aplicado quando falamos de computação, e nos ajuda a perceber muitos aspectos, que quase sempre fazemos no automático.
Por exemplo, no caso da Entrada. O teclado é um periférico ou um dispositivo de Entrada. Toda vez que digitamos algo, automaticamente ele aparece na tela, não é mesmo? Contudo, já estudamos que para o computador tudo é uma sequência de vários 0 e 1. Isso significa, portanto, que o computador está sempre realizando conversões, cálculos ou computações.
Agora, pense em uma foto ou uma imagem, por exemplo. Ela nada mais é que uma matriz (linha x coluna) de pixels. Se você ampliar bastante uma imagem, poderá perceber isso. Um pixel é a menor divisão de uma imagem. Aquele pixel vai conter uma codificação para representação da cor que na grande maioria utiliza um sistema que já aprendemos, o hexadecimal.
Com certeza, para resolver o problema de como transferir a nossa maneira de entender as coisas para a maneira com que uma máquina entende, foi necessário bastante criatividade, não é mesmo? Agora, fica a pergunta: será que essas codificações serão suficientes para as próximas tecnologias que chegarão? O que podemos dizer da realidade virtual que cresce em importância a cada ano?
Conforme você vem aprendendo, as codificações estão no nosso dia a dia, e quando pensamos no futuro, é possível ver isso ainda mais presente! Quer um exemplo? As casas no futuro serão smart houses. Tudo controlado à distância, desde a abertura da porta até a temperatura do ar condicionado, o grau de luminosidade de lâmpadas inteligentes, e talvez até a geladeira que faz compras sozinha do item que você quer.
Mas vamos usar um exemplo mais comum?
Por exemplo, você utiliza portão eletrônico? Ou ao menos sabe como ele funciona? Fiz essas perguntas, porque o princípio utilizado no portão eletrônico vale para controles remotos, câmeras, portões, elevadores etc.
Pensando em um portão eletrônico como exemplo, ele precisa muito da codificação! Pois seu funcionamento é por meio da emissão de sinais do controle remoto. O mesmo princípio ocorre para alarme residencial ou automotivo. Por meio de transmissões em radiofrequência (Megahertz) e um receptor e modulador, a “mágica” acontece.
Nesses casos, é necessário a existência de um codificador que é programado diretamente na fábrica. Alguns deles funcionam trabalhando com 4 bits para realizar o controle e outros 24 bits para dados (lembre-se que cada bit pode ser um número 0 ou um número 1). Ele, então, vai codificar os 24 bits e realizar a transmissão em série. Desta forma, ele precisa entender o que é disparo ou ativação, e para isso é preciso definir o que o 0 vai representar (um pulso maior ou menor). O bit 1 representará o oposto da escolha.
Assim, sempre que acionar um alarme ou abrir um portão, lembre-se que tudo está sendo convertido para uma sequência de bits.
Quando você pensa em codificação, talvez você se lembre que o homem sempre se comunicou por meio de códigos. Na pré-história, o homem se comunicou por meio dos desenhos nas cavernas e sinais de fumaça. Ainda pensando em códigos, posso citar a você uma forma de comunicação universal, que é o código morse.
Se você parar um pouco para pensar, neste momento estamos nos comunicando por meio de caracteres pertencentes a um idioma, e para codificar esse texto, é necessário a atribuição de um valor (binário) para cada caractere, letra ou número do alfabeto.
Guimarães e Lages (2005) dizem que um dos códigos mais populares para computadores é o código ASCII (American Standard Code for Information Exchange). A primeira padronização foi em 1963 e, depois, foram realizadas evoluções e extensões. Os computadores já saem de fábrica utilizando este tipo de codificação.
Na página da Columbia University, é possível acessar a tabela US ASCII, e você também encontrará a conversão da tabela para cada caractere do teclado que utilizamos. Para acessar a tabela US ASCII, clique aqui.
Por exemplo, as letras minúsculas de “a” a “f” em ASCII são em binário, conforme a Tabela 1:
Neste ponto, você pode até fazer a conversão dos binários, para identificar que decimal representa as letras, não é? Seriam 97, 98, 99, 100, 101, 102.
Interessante, então, perceber que toda vez que você digita um “a”, para o computador é a mesma coisa que “01100001”. Mas e quando eu digito o “A” ou outras letras no formato de letra maiúscula? Veja a Tabela 2:
Agora, vou deixar a conversão dos binários para o decimal com você!
Conforme você deve ter percebido pelo nome, a codificação ASCII foi baseada no idioma inglês e, portanto, foi pensado para trabalhar com 128 caracteres (7 bits). Isso permitiu que todas as letras maiúsculas, minúsculas, os sinais de pontuação e símbolos (# * + entre outros) fossem incluídos. Dessa forma, são 95 sinais gráficos (letras do alfabeto latino, sinais de pontuação e sinais matemáticos) e 33 sinais de controle.
Há comandos que acabaram sendo padronizados para uma ação específica.
Embora existam diferentes fabricantes, é quase uma normativa utilizar 0x0A para controlar dispositivos de impressão.
Como ele nasceu na padronização americana, você deve ter percebido ao acessar a página da Columbia University que ele não possui acentos, cedilha, entre outros. No entanto, existem outras codificações. Por exemplo, podemos citar o UTF-8 e o ISO-8859. No entanto, é importante destacar que, mesmo sendo outras codificações, elas são compatíveis com a ASCII (os 128 caracteres iniciais).
À medida que a computação foi crescendo, tornou-se necessário criar formas de incluir caracteres de vários idiomas, e provavelmente, ainda surgirão outros caracteres ao longo do tempo. Para lidar com isso, foi criado um consórcio chamado Unicode. Este consórcio atribui códigos para mais de 1 milhão de caracteres. Eles são codificados em notação hexadecimal e tornou-se comum a associação do prefixo U+ a cada número, conforme a Tabela 3:
Dessa maneira, uma codificação (character encoding) pode ser explicada como uma tabela que associa bytes com cada número, como se fosse uma conversão. Para melhor entender como isso funciona, temos que lembrar que a sequência de bytes associada com um caractere é o código do caractere. Ou seja, seria a representação do caractere na memória do computador e em arquivos digitais.
Conforme visto anteriormente, o Unicode tem mais de 1 milhão de caracteres, com isso são necessários 3 bytes, no caso da notação binária. Para otimizar a codificação, foi criado o multibyte, que, em vez de utilizar um número fixo de bytes, utiliza um número variável por caractere.
Este tipo de otimização do código Unicode se chama UTF-8. Ele realiza uma associação de 1 a 4 bytes (8 a 32 bits) com cada caractere Unicode. Assim, para os primeiros 128 caracteres, utiliza-se o ASCII (1 byte por caractere) e os outros ele trata de forma diferente, conforme Tabela 4:
Para estes casos de multibyte, se quisermos decodificar, será necessário saber onde termina o código de um caractere e onde começa o código seguinte. Como assim? É simples! Quando criado, ele já foi preparado para que sempre os primeiros bits informem o seu tamanho.
Desta forma, fica fácil, não é mesmo? Então, se o primeiro bit for 0 (menor que 128), esse é o único byte do caractere. Contudo, se o valor do primeiro estiver entre 192 e 223, então o código do caractere tem dois bytes.
Dessa maneira, podemos, então, entender a importância das codificações. Sem elas, um simples texto que você fosse escrever teria que estar em binário para que o computador o entendesse e processasse.
Você sabia que a maioria dos nossos dados estão guardados em arquivos de texto? E você sabe como funcionam estes arquivos? Por codificações. Quando você escolhe uma extensão para seu arquivo, sem saber você também está escolhendo uma codificação para ele.
No nosso exemplo, um arquivo de texto tem seus bytes representados por caracteres. Se eles utilizarem a codificação que aprendemos (UTF-8), já sabemos que cada caractere é representado por 1, 2, 3, ou 4 bytes consecutivos.
Mas como ele sabe a sequência de leitura? Por exemplo, ao terminar uma linha?
Basta codificarmos o que vai representar cada fim de linha.
A grande maioria desses arquivos, por exemplo, utiliza o byte \n.
Sabe onde podemos ver claramente isso? Arquivos de envio e retorno para registro de boletos no sistema bancário. Os controles são realizados por arquivos texto, para que os caixas humanos ou eletrônicos consigam ler as informações do boleto e realizar o registro.
GUIMARÃES, A. M.; LAGES, N. A. Introdução à Ciência da Computação. Rio de Janeiro: LTC, 2005.