Diferenças
Aqui você vê as diferenças entre duas revisões dessa página.
c:codificacao_de_caracteres [2023/08/01 17:17] – criada maziero | c:codificacao_de_caracteres [2023/08/01 20:13] (atual) – edição externa 127.0.0.1 | ||
---|---|---|---|
Linha 1: | Linha 1: | ||
+ | ====== Codificação de caracteres ====== | ||
+ | |||
+ | {{ progc_strings_codificacao.mkv |Video desta aula}} | ||
+ | |||
+ | Internamente, | ||
+ | |||
+ | Para armazenar informações mais complexas que os bytes, é necessário **codificar** as mesmas, ou seja, transformá-las em sequências de bytes. Esta página discute as técnicas usadas para transformar as **letras e símbolos de um texto** em bytes, para poder armazená-lo e tratá-lo em um computador. | ||
+ | |||
+ | A figura a seguir mostra as etapas do tratamento de uma letra '' | ||
+ | |||
+ | {{ character_encoding.png |Codificação de caracteres}} | ||
+ | |||
+ | ===== Algumas definições ===== | ||
+ | |||
+ | * **Caractere**: | ||
+ | * **Conjunto de caracteres** (// | ||
+ | * **Codificação** (// | ||
+ | |||
+ | Existem diversas codificações de caracteres; a seguir serão apresentadas as mais usuais. | ||
+ | |||
+ | ===== A codificação ASCII ===== | ||
+ | |||
+ | A codificação de caracteres mais antiga ainda em amplo uso é a [[https:// | ||
+ | |||
+ | <note important> | ||
+ | Praticamente **TODOS** os sistemas computacionais suportam ASCII ! | ||
+ | </ | ||
+ | |||
+ | A codificação ASCII abrange o conjunto de caracteres da língua inglesa, sinais gráficos e alguns caracteres de controle (nova linha, tabulação, | ||
+ | |||
+ | A codificação ASCII é definida através da famosa **Tabela ASCII**, que é dividida em duas partes: | ||
+ | |||
+ | * 0 - 31 e 127: caracteres de controle (// | ||
+ | * 32 - 126: caracteres imprimíveis (A, B, C, ...), independentes de terminal. | ||
+ | |||
+ | {{ asciifull.gif |A tabela ASCII}} | ||
+ | |||
+ | A codificação ASCII ainda é amplamente usada para codificação de textos puros em inglês, como códigos-fonte de programas, páginas HTML, arquivos de configuração, | ||
+ | |||
+ | ===== Code pages ===== | ||
+ | |||
+ | A codificação ASCII não suporta caracteres acentuados (á é ñ ë) ou caracteres específicos de outras línguas, como ç ¥ β ɣ 诶 etc. Pode-se usar o oitavo bit de cada byte para associar caracteres aos valores acima de 127. Isso levou à criação de diversas **tabelas ASCII estendidas** para definir os símbolos de 128 a 255. Cada codificação é denominada uma **code page**; algumas das mais conhecidas são: | ||
+ | |||
+ | * [[https:// | ||
+ | * [[https:// | ||
+ | * [[https:// | ||
+ | * [[https:// | ||
+ | * [[https:// | ||
+ | |||
+ | ===== Codificações ISO-8859 ===== | ||
+ | |||
+ | Nos anos 1980, para para tentar organizar a profusão de codepages ASCII estendidas, a ISO propôs o conjunto de padrões [[https:// | ||
+ | |||
+ | * [[https:// | ||
+ | * [[https:// | ||
+ | * [[https:// | ||
+ | * [[https:// | ||
+ | * [[https:// | ||
+ | |||
+ | As codificações ISO-8859 se tornaram um padrão mundial e ainda são amplamente usadas em muitos sistemas, sendo gradualmente substituída pela codificação Unicode em sistemas mais recentes. Elas são compatíveis com a codificação ASCII, pois representam cada caractere com **somente um byte** e respeitam as definições ASCII dos caracteres de 0 a 127. | ||
+ | |||
+ | <note important> | ||
+ | Programas que manipulem caracteres ISO devem usar variáveis '' | ||
+ | </ | ||
+ | |||
+ | ===== Caracteres multibyte ===== | ||
+ | |||
+ | O maior problema das codificações ISO-8859 é o uso de somente **um byte por caractere**, | ||
+ | |||
+ | Para representar conjuntos com mais de 256 caracteres é necessário usar **caracteres multibyte**, | ||
+ | |||
+ | Vários padrões de codificação multibyte foram propostos, como: | ||
+ | |||
+ | * [[https:// | ||
+ | * [[https:// | ||
+ | * [[https:// | ||
+ | * [[https:// | ||
+ | * **Unicode** | ||
+ | |||
+ | Alguns destes padrões definem todos os caracteres com uma quantidade fixa de bits (16 ou 32), enquanto outros definem caracteres com tamanho variável (8, 16 ou 32 bits). | ||
+ | |||
+ | ===== Unicode ===== | ||
+ | |||
+ | O padrão [[https:// | ||
+ | |||
+ | Em Unicode, cada caractere possui um código numérico único, chamado //code point//, que pode ser representado de diversas formas. Por exemplo, o //code point// do emoji 😜 vale 128540 (1F61C< | ||
+ | |||
+ | * '' | ||
+ | * ''&# | ||
+ | * '' | ||
+ | |||
+ | Caracteres em Unicode podem ser codificados (representados em bytes) de diversas formas: | ||
+ | |||
+ | * [[https:// | ||
+ | * [[https:// | ||
+ | * [[https:// | ||
+ | |||
+ | ===== A codificação UTF-8 ===== | ||
+ | |||
+ | UTF-8 é certamente a codificação multibyte [[https:// | ||
+ | |||
+ | Em UTF-8, cada caractere Unicode é codificado usando de 1 a 4 bytes, conforme o número de bits de seu //code point//: | ||
+ | |||
+ | ^ Caractere ^ Code point ^ Em binário | ||
+ | | A | 41< | ||
+ | | ç | E7< | ||
+ | | © | C2A9< | ||
+ | | 😀 | 1F600< | ||
+ | |||
+ | A regra de codificação de cada caractere é escolhida conforme o número de bits usados pelo seu //code point//: | ||
+ | |||
+ | |< 100% 15% 55% >| | ||
+ | ^ # de bits do caractere ^ formato codificado ^ bytes ^ Uso ^ | ||
+ | | até 7 bits | '' | ||
+ | | 8-11 bits | '' | ||
+ | | 12-16 bits | '' | ||
+ | | 17-21 bits | '' | ||
+ | |||
+ | Pode-se observar que bytes os bytes iniciando em '' | ||
+ | |||
+ | Além disso, todos os bytes iniciando em '' | ||
+ | |||
+ | <note tip> | ||
+ | **Dica**: pode-se visualizar o conteúdo de um arquivo em hexadecimal ou binário usando o comando '' | ||
+ | </ | ||
+ | |||
+ | O mecanismo de codificação de //code points// Unicode em UTF-8 funciona da seguinte forma: | ||
+ | |||
+ | - Dado um caractere, verifica-se quantos bits são necessários para armazenar seu código em UTF-8. Por exemplo, o caractere 😀 (//code point// '' | ||
+ | - Para 17 bits é necessário codificar usando 4 bytes (faixa 17-21 bits) | ||
+ | - Distribui-se os bits do código numérico do caractere nos espaços disponíveis:< | ||
+ | Code point (hex) | ||
+ | Code point (bin) 0001 1111 0110 0000 0000 | ||
+ | Encoding format | ||
+ | Code point (bin) 000 01 1111 01 1000 00 0000 | ||
+ | Encoded character | ||
+ | f 0 9 f 9 8 8 0</ | ||
+ | - Com isso, a codificação de U+1f600 em UTF-8 resulta nos 4 bytes '' | ||
+ | - A decodificação (de UTF-8 para o //code point//) se efetua fazendo o caminho inverso. | ||
+ | |||
+ | Alguns arquivos codificados em UTF-* podem apresentar em seus dois primeiros bytes um valor chamado BOM (//Byte Order Mark//), que define em que ordem os bytes de cada caractere devem ser considerados: | ||
+ | |||
+ | ^ Bytes ^ Encoding Form ^ | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | |||
+ | <note tip> | ||
+ | **Dica**: no Linux, pode-se digitar caracteres Unicode usando as seguintes teclas: '' | ||
+ | </ | ||
+ | |||
+ | ===== Comparando as codificações ===== | ||
+ | |||
+ | O quadro a seguir compara a representação da string " | ||
+ | |||
+ | ^ Codificação ^ BOM ^ e ^ q ^ u ^ a ^ ç ^ ã ^ o ^ ^ | ||
+ | ^ ASCII | ||
+ | ^ ISO-8859-1 | ||
+ | ^ UTF-8 | ||
+ | ^ UTF-16 (be) | '' | ||
+ | |||
+ | ===== Conversão de codificações ===== | ||
+ | |||
+ | O comando '' | ||
+ | |||
+ | < | ||
+ | $ file exemplo.* | ||
+ | exemplo.c: | ||
+ | exemplo.html: | ||
+ | exemplo.txt: | ||
+ | </ | ||
+ | |||
+ | A conversão de codificação de um arquivo de texto pode ser feita com utilitários específicos, | ||
+ | |||
+ | <code shell> | ||
+ | iconv -f ISO-8859-15 -t UTF-8 < input.txt > output.txt | ||
+ | </ | ||
+ | |||
+ | Além disso, os editores de texto geralmente permitem escolher a codificação ao salvar o arquivo. Por exemplo, no VI: | ||
+ | |||
+ | <code vi> | ||
+ | :set fileencoding=utf8 | ||
+ | :w myfilename | ||
+ | </ | ||
+ | |||
+ | ===== Mais informações ===== | ||
+ | |||
+ | Sobre codificações e Unicode: | ||
+ | |||
+ | * https:// | ||
+ | * https:// | ||
+ | * https:// | ||
+ | * https:// | ||
+ | * http:// | ||
+ | |||
+ | ===== Exercícios ===== | ||
+ | |||
+ | - Use o programas '' | ||
+ | - o arquivo {{exemplo.c |}} para UTF-8 | ||
+ | - o arquivo {{exemplo.c |}} para ASCII | ||