UTF-8(7)

NOME
UTF-8 - uma codificação Unicode multibyte compatível com ASCII

DESCRIÇÃO
O conjunto de caracteres Unicode 3.0 ocupa um espaço de código de 16 bits. A codificação Unicode mais óbvia (conhecida como UCS-2) consiste de uma sequência de palavras de 16 bits. Tais palavras podem conter, como parte de seus vários caracteres de 16 bits, bytes como '\0' ou '/', que têm um significado especial em nomes de arquivos e outros parâmetros de funções em bibliotecas C. Além disso, a maioria das ferramentas UNIX esperam arquivos ASCII e não podem ler palavras de 16 bits como caracteres sem modificações maiores. Por essas razões, UCS-2 não é uma codificação externa adequada de Unicode em nomes de arquivos, arquivos-texto, variáveis de ambiente, etc. O Universal Character Set (UCS), um superconjunto de Unicode da ISO/IEC 10646, ocupa um espaço de código ainda maior — 31 bits — e a óbvia codificação UCS-4 para ele (uma sequência de palavras de 32 bits) tem o mesmo problema.

A codificação UTF-8 de Unicode e UCS não tem esses problemas e é a maneira mais comum de usar o conjunto de caracteres Unicode sob sistemas operacionais do estilo Unix.

  Propriedades
A codificação UTF-8 tem as seguintes belas propriedades:

•   Caracteres UCS de 0x00000000 a 0x0000007f (os clássicos caracteres US-ASCII) são codificadas simplesmente como bytes de 0x00 a 0x7f (compatibilidade com ASCII). Isto significa que os arquivos e strings que contêm somente caracteres ASCII de 7 bits têm a mesma codificação tanto sob ASCII quanto sob UTF-8.

•   Todos os caracteres UCS maiores que 0x7f são codificados como uma sequência multibyte, consistindo somente de bytes na faixa de 0x80 a 0xfd, de forma que nenhum byte ASCII apareça como parte de outro caractere e não haja problemas com, por exemplo, '\0' ou '/'.

•   A ordenação lexicográfica das strings UCS-4 é preservada.

•   Todos os 2^31 códigos UCS possíveis podem ser codificados usando-se UTF-8.

•   Os bytes 0xc0, 0xc1, 0xfe e 0xff nunca são usados na codificação UTF-8.

•   O primeiro byte de uma sequência multibyte que representa um único caractere UCS não-ASCII está sempre na faixa 0xc2 a 0xfd, e indica o tamanho desta sequência multibyte. Todos os bytes seguintes na sequência multibyte estão na faixa de 0x80 a 0xbf. Isto permite uma ressincronização fácil e torna a codificação independente de estado, e robusta contra perda de bytes.

•   UTF-8 codificados em UCS podem ter até seis bytes de comprimento, porém os caracteres Unicode padrão específica nenhum caractere acima de 0x10ffff, assim caracteres Unicode somente podem ter mais de quatro bytes de comprimento em UTF-8.

  Codificação
As seguintes sequências de bytes são usadas para representar um caractere. A sequência a ser usada depende do número de código UCS do caractere:

0x00000000 - 0x0000007F:
    0xxxxxxx

0x00000080 - 0x000007FF:
    110xxxxx 10xxxxxx

0x00000800 - 0x0000FFFF:
    1110xxxx 10xxxxxx 10xxxxxx

0x00010000 - 0x001FFFFF:
    11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

0x00200000 - 0x03FFFFFF:
    111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

0x04000000 - 0x7FFFFFFF:
    1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

As posições de bit xxx são preenchidas com os bits do número do código de caractere na representação binária, com o primeiro bit mais significante primeiro (big-endian). Somente a sequência multibyte mais curta possível que pode representar o número do código do caractere pode ser usada.

Os valores de código UCS 0xd800–0xdfff (substitutos UTF-16) assim como 0xfffe e 0xffff (não-caracteres UCS) não deveriam aparecer em conformidade com o fluxo UTF-8. De acordo com o RFC 3629, nenhum ponto acima de U+10FFFF deve ser usado, o que limita os caracteres a quatro bytes.

  Exemplo
O caractere Unicode 0xa9 = 1010 1001 (o sinal de copyright) é codificado em UTF-8 como

    11000010 10101001 = 0xc2 0xa9

e o caractere 0x2260 = 0010 0010 0110 0000 (o símbolo de "diferente") é codificado como:

    11100010 10001001 10100000 = 0xe2 0x89 0xa0

  Notas para aplicação
Usuários tem que selecionar uma localidade UTF-8, por exemplo, com

    export LANG=en_GB.UTF-8

para ordenar a ativação do suporte UTF-8 nas aplicações.

Aplicações que tem sido usuárias prevenidas de codificação de caractere sempre deveriam selecionar a localização com, por exemplo,

    setlocale(LC_CTYPE, "")

e programadores podem, então, testar a expressão

    strcmp(nl_langinfo(CODESET), "UTF-8") == 0

para determinar se uma localidade UTF-8 já foi selecionado e se todo texto plano da entrada e saída padrão, comunicação de terminal, conteúdo de texto plano, nomes de arquivos e variáveis de ambiente são codificadas em UTF-8.

Programadores acostumados com codificações de byte único como US-ASCII e ISO/IEC 8859 têm de estar cientes que duas suposições não são mais válidas na localização UTF-8. Primeiramente, um byte simples não corresponde necessariamente a um caractere único. Em segundo lugar, desde os emuladores de terminal modernos em UTF-8 também podem prover suporte a caracteres de tamanho duplo de chinês, japonês e coreano, bem como caracteres de combinação sem espaçamento, emitindo um caractere único não necessariamente avançando o cursor por uma posição como é feito em ASCII. Bibliotecas de funções como mbsrtowcs(3) e wcswidth(3) devem ser usadas nos dias atuais para contar caracteres e posições de cursor.

A sequência oficial de ESC para alternar, oriunda do esquema de codificação ISO/IEC 2022 (como usada, por exemplo, por terminais VT100) para UTF-8 é ESC % G ("\x1b%G"). O sequência de retorno correspondente da UTF-8 para ISO/IEC 2022 é ESC % @ ("\x1b%@"). Outras sequências ISO/IEC 2022 (tais como para trocar os conjuntos G0 e G1) não são aplicadas no modo UTF-8.

  Segurança
Os padrões Unicode e UCS requerem que produtores de UTF-8 usem a menor forma possível, isto é, produzindo uma sequência de dois bytes sendo o primeiro 0xc0. Unicode 3.1 foi adicionada um requisição que programas não devem aceitar formas não-reduzidas em suas entradas. Por razões de segurança: se a entrada do usuário for verificada, contra violações de segurança, um programa poderia verificar somente pelas versões ASCII de "/../" ou ";" ou NUL e negar que há muitas maneiras non-ASCII de representar isto nas formas não-reduzidas UTF-8.

  Padrões
ISO/IEC 10646-1:2000, Unicode 3.1, RFC 3629, Plan 9.

VEJA TAMBÉM
locale(1), nl_langinfo(3), setlocale(3), charsets(7), unicode(7)

TRADUÇÃO
A tradução para português brasileiro desta página man foi criada por Rubens de Jesus Nogueira <darkseid99@usa.net>, André Luiz Fassone <lonely_wolf@ig.com.br> e Rafael Fontenelle <rafaelff@gnome.org>.

Esta tradução é uma documentação livre; leia a Licença Pública Geral GNU Versão 3 (https://www.gnu.org/licenses/gpl-3.0.html) ou posterior para as condições de direitos autorais. Nenhuma responsabilidade é aceita.

Se você encontrar algum erro na tradução desta página de manual, envie um e-mail para a lista de discussão de tradutores (debian-l10n-portuguese@lists.debian.org).