Scroll to navigation

UTF-8(7) Miscellaneous Information Manual UTF-8(7)

NOME

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

DESCRIÇÃO

The Unicode 3.0 character set occupies a 16-bit code space. The most obvious Unicode encoding (known as UCS-2) consists of a sequence of 16-bit words. Such strings can contain—as part of many 16-bit characters—bytes such as '\0' or '/', which have a special meaning in filenames and other C library function arguments. In addition, the majority of UNIX tools expect ASCII files and can't read 16-bit words as characters without major modifications. For these reasons, UCS-2 is not a suitable external encoding of Unicode in filenames, text files, environment variables, and so on. The ISO 10646 Universal Character Set (UCS), a superset of Unicode, occupies an even larger code space—31 bits—and the obvious UCS-4 encoding for it (a sequence of 32-bit words) has the same problems.

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:

*
UCS characters 0x00000000 to 0x0000007f (the classic US-ASCII characters) are encoded simply as bytes 0x00 to 0x7f (ASCII compatibility). This means that files and strings which contain only 7-bit ASCII characters have the same encoding under both ASCII and UTF-8 .
*
All UCS characters greater than 0x7f are encoded as a multibyte sequence consisting only of bytes in the range 0x80 to 0xfd, so no ASCII byte can appear as part of another character and there are no problems with, for example, '\0' or '/'.
*
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.

Programmers accustomed to single-byte encodings such as US-ASCII or ISO 8859 have to be aware that two assumptions made so far are no longer valid in UTF-8 locales. Firstly, a single byte does not necessarily correspond any more to a single character. Secondly, since modern terminal emulators in UTF-8 mode also support Chinese, Japanese, and Korean double-width characters as well as nonspacing combining characters, outputting a single character does not necessarily advance the cursor by one position as it did in ASCII. Library functions such as mbsrtowcs(3) and wcswidth(3) should be used today to count characters and cursor positions.

The official ESC sequence to switch from an ISO 2022 encoding scheme (as used for instance by VT100 terminals) to UTF-8 is ESC % G ("\x1b%G"). The corresponding return sequence from UTF-8 to ISO 2022 is ESC % @ ("\x1b%@"). Other ISO 2022 sequences (such as for switching the G0 and G1 sets) are not applicable in UTF-8 mode.

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 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.

10 fevereiro 2023 Linux man-pages 6.03