NOME¶
charsets - Conjuntos de caracteres e internacionalização do ponto de
  vista do programador
DESCRIÇÃO¶
O linux é um sistema operacional internacional. Vários de seus
  utilitários e drivers (inclusive o driver do console) suportam
  vários conjuntos de caracteres, inclusive acentos, ligaduras e
  marcações diacríticas; além de outros alfabetos, inclusive
  o grego, cirílico, árabe e hebraico.
Esta página dá uma visão orientada ao programador das diferentes
  normas de conjuntos de caracteres, explicando como elas se encaixam no linux.
  Os padrões abordados incluem ASCII, ISO 8859, KOI8-R, Unicode, ISO 2022 e
  ISO 4873.
 
ASCII¶
ASCII (American Standard Code For Information Interchange) é um conjunto de
  caracteres de 7 bits originalmente criado para o inglês americano.
  Atualmente é descrito pela norma ECMA-6.
Há uma variante do ASCII que substitui o símbolo americano para a
  libra com o símbolo britânico da libra esterlina. Este ASCII é
  usado na Grã-Bretanha, e é chamado "UK ASCII", sendo o
  americano designado "US ASCII".
Como o linux foi escrito para hardware americano, ele normalmente suporta o
  ASCII americano
 
ISO 8859¶
ISO 8859 é um conjunto de 10 conjuntos de caracteres de 8 bits que
  começam com o ASCII americano (primeiros 128 caracteres), que são
  seguidos de caracteres de controle invisíveis (posições 128 a
  159) e 96 gráficos de largura fixa nas posições de 160 a 255.
Destes, o mais importante é o ISO 8859-1 (Latin-1), que é suportado
  pelo driver do console linux, razoavelmente bem suportado pelo X11R6 e é
  o conjunto base do HTML.
O suporte aos outros conjuntos do 8859 pelo console pode ser ativado por
  utilitários como 
setfont(8) que modificam as ações do
  teclado e a tabela de gráficos EGA e usam a a tabela e fontes mapeada
  pelo usuário no controlador do console.
Seguem descrições breves de cada conjunto:
  - 8859-1 (Latin-1)
 
  - Latin-1 serve para a maioria das linguas européias
      ocidentais como o albanês, catalão, dinamarquês,
      holandês, inglês, finlandês, francês, alemão,
      galício, irlandês, islandês, italiano, noruegu6es,
      português, espanhol e sueco. A falta de ligaduras ij (holandês),
      oe (francês) e das aspas ,, e `` do alemão é
      tolerável.
 
  - 8859-2 (Latin-2)
 
  - Latin-2 serve para a maiora das linguas eslavas e
      centro-européias de escrita latina, tais como: croata, tcheco,
      alemão, húngaro, polonês, romeno, eslovaco e esloveno.
 
  - 8859-3 (Latin-3)
 
  - Latin-3 é muito utilizado por quem escreve em
      esperanto, galício, maltês e turco.
 
  - 8859-4 (Latin-4)
 
  - Latin-4 contém letras para o estoniano, látvio e
      lituano. Está basicamente obsoleto, veja 8859-10 Latin-6.
 
  - 8859-5
 
  - Cirílico. Suporta búlgaro, bielorusso,
      macedônio, russo, sérvio e ucraninano. Os ucranianos lêem a
      letra 'ghe' 'heh', e precisariam de um ghe acentuado para escrever esta
      letra corretamente. Veja a discussão sobre o KOI8-R abaixo.
 
  - 8859-6
 
  - Suporta árabe. A tabela de glifos do 8859-6 é uma
      fonte fixa com formas separadas. Para exibi-las, um driver tem que
      conbiná-las usando as formas iniciais, média e final.
 
  - 8859-7
 
  - Suporta o grego moderno.
 
  - 8859-8
 
  - Suprota hebraico.
 
  - 8859-9 (Latin-5)
 
  - Uma variante do Latin-1 que substitui letras islandesas
      raramente usadas por letras turcas.
 
  - 8859-10 (Latin-6)
 
  - Latin 6 contém as letras inuit (Groelandesas) e sami
      (lapônicas) ausantes do latin-4 de modo a abranger toda a área
      nórdica. O RFC 1345 contém um 'latin6' preliminar que é
      diferente. O sami skolt requer alguns acentos que estão ausentes
      nesta versão.
 
  - 8859-13 (Latin-7)
 
  
  - 8859-14 (Latin-8)
 
  
  - 8859-15
 
  - Acrescenta o sinal de euro e as ligaduras francesas que
      estão ausentes no Latin-1.
 
KOI8-R¶
KOI8-R é um conjunto de caracteres não ISO muito usado na Rússia.
  A metade inferior é ASCII americano, e a superior é um conjunto de
  caracteres cirílicos um pouco melhor projetado que o do ISO 8859-5.
O suporte a KOI8-R pelo console é acionado por utilitários que
  modificam o mapeamento do teclado e a tabela de gráficos EGA, utilizando
  a tabela de mapeamento pelo usuário no driver do console.
UNICODE¶
Unicode (ISO 106460 é uma norma que visa representar sem ambigüidade
  todos os símbolos usados em linguagens humanas. A encodificação
  é em 32 bits (as versões mais antigas usam 16 bits). Mais
  informações sobre o Unicode em <
http://www.unicode.com>.
O linux representa o unicode com o Unicode transfer Format (UTF-8) de 8 bits.
  UTF-8 representa o Unicode com comprimento variável, usando 1 byte para 7
  bits, 2 para 11 bits, 3 para 16 bits, 4 para 21 bits, 5 para 26 bits e 6 para
  31 bits.
Sejam 0,1,x um zero, um, ou bit arbitrário. Um byte 0xxxxxxx representa o
  caracter unicode 00000000 0xxxxxxx, que por sua vez codifica o mesmo que
  0xxxxxxx em ASCII. Assim, o ASCII não é modificado pelo UTF-8, e as
  pessoas que usem apenas ASCII não notarão nenhuma diferença:
  nem no código nem no tamanho do arquivo. LP Um byte 110xxxxx inicia um
  código de 2 bytes, e a seqüência 110xxxxx 10yyyyyy é
  traduzida para 00000xxx xxyyyyyy. Um byte 1110xxxx inicia um código de 3
  bytes, e 1110xxxx 10yyyyyy 10zzzzzz é traduzida para xxxxyyyy yyzzzzzz.
  Quando se usa UTF-8 para o ISO 10646 de 31 bits, esta progressão continua
  até códigos de 6 bytes.
Para os usuários de ISO-8859-1 isto significa que os caracteres com o bit
  mais significativo presente passam a ser codificados com dois bytes. Isto
  tende a aumentar o tamanho de arquivos de texto em um ou dois porcento.
  Não há problemas de conversão, no entanto, porque os valores
  unicode dos símbolos ISO-8859-1 são iguais aos valores originais no
  ISO 8859-1 (seguidos por oito bits zero). Para os usuários japoneses,
  isto significa que os códigos de 16 bits atualmente usados passam a
  necessitar de 3 bytes, e são necessárias extensas tabelas de
  mapeamento. Muitos usuários japoneses preferem o ISO 2022 por isso.
Observe que o UTF-8 é auto-sincronizante: 10xxxxxx inicia, e todo o resto
  do byte termina um código. Observe ainda que bytes ASCII aparecem em um
  fluxo UTF-8 representados unicamente do modo como eles aparecem. É
  especialmente importante que os NULs e '/' não são modificados.
Como o ASCII,o NUL e o '/' não são modificados, o kernel não
  percebe que o UTF-8 está sendo usado. Ele não se importa com quais
  são os significados dos bytes com que ele está lidando.
A tradução de streams unicode é normalmente feita por tabelas
  'subfont', que associam subconjuntos do unicode a glifos. Internamente, o
  kernel usa unicode para descrever a subfonte carregada na RAM de vídeo.
  Isto significa que se pode usar um conjunto de caracteres com 512
  símbolos no modo UTF-8. Isto não é suficiente para
  japonês, chinês ou coreano, mas serve para a maioria das outras
  aplicações.
 
ISO 2022 AND ISO 4873¶
As normas ISO 2022 e 4873 descrevem um modelo de controle de fonte baseado no
  VT100. Este modelo é parcialmente suportado pelo kernel e pelo
  
xterm(1). É popular no Japão e na Coréia.
Há quatro conjuntos de caracteres gráficos (G0, G1, G2 e G3), um dos
  quais é o conjunto atual de caracteres para códigos com o bit mais
  significativo ausente (inicialmente é o G0), e um deles é o conjunto
  inicial para códigos com este bit presente (inicialmente o G1). Cada
  conjunto gráfico tem 94 ou 96 caracteres, e é essencialmente um
  conjunto de 7 bits. Eles utilizam os códigos de 040 a 0177 (ou 041 a
  0176) ou de 0240 a 0377 (ou de 0241 a 0376). G0 sempre tem 94 de tamanho e usa
  os códigos de 041 a 0176.
A mudança entre os conjuntos de caracteres é feita com as
  funções de permuta ^N (SO ou LS1), ^O (SI ou LS0), ESC n (LS2), ESC
  o (LS3), ESC N (SS2), ESC O (SS3), ESC ~ (LS1R), ESC } (LS2R), ESC | (LS3R). A
  função LS 
n aciona o conjunto de caracteres G
n para
  códigos com o bit mais significativo ausente. A função LS
  
nR aciona o conjunto de caracteres G 
n para códigos com o
  bit mais significativo presente. A função SS 
n aciona o
  conjunto de caracteres G 
n (
n=2 ou 3) para o próximo
  caracter independente do valor de seu bit mais significativo.
Os conjuntos de caracteres de 94 itens - designado G 
n - podem ser
  ativados pelas seqüências 'ESC ( xx' (G0); 'ESC ) xx' (G1), 'ESC *
  xx' (G2) e 'ESC + xx' (G3); onde xx é um código definido pela norma
  ISO 2375 (conjunto internacional de conjuntos de caracteres codificados). Por
  exemplo, ESC ( @ seleciona o conjunto ISO 646 como G0, ESC ( A seleciona o
  conjunto britânico de caracteres (com o símbolo da libra ao
  invés do número), ESC ( B seleciona ASCII (com o dólar no lugar
  do símbolo de moeda), ESC ( M seleciona um conjunto de caracteres para
  linguagens africanas, ESC ( ! seleciona um conjunto de caracteres cubano, etc,
  etc.
Um conjunto de caracteres de 96 itens - designado G 
n - é
  ativável pela seqüência ESC - xx (G1), ESC . xx (G2) ou ESC /
  xx (G3). Por exemplo, ESC - G seleciona o alfabeto hebraico como G1.
Um conjunto de caracteres com múltiplos bytes - designado G 
n -
  é acionado com as seqüências 'ESC $ xx' ou 'ESC $ ( xx' (G0),
  ESC $ ( C coloca o conjunto de caracteres coreano em G0. O conjunto
  japonês invocado por ESC $ B tem uma versão mais recente
  selecionável por 'ESC & @ ESC $ B'.
ISO 4873 define um conjunto de caracteres mais estreitos, no qual G0 é fixo
  (sempre ASCII), do modo que G1, G2 e G3 só podem ser invocados por
  códigos com o bit mais significativo presente. Especificamente, ^N e ^O
  não são mais usados, ESC ( xx pode ser usado apenas com xx=B; e ESC
  ) xx, ESC * xx e ESC + xx equivalem a ESC - xx, ESC . xx e ESC / xx
  respectivamente.
 
VEJA TAMBÉM¶
console(4), 
console_ioctl(4), 
console_codes(4),
  
ascii(7), 
iso_8859_1(7), 
unicode(7), 
utf-8(7)
TRADUZIDO POR LDP-BR em 21/08/2000.¶
Paulo César Mendes <drps@ism.com.br> (tradução) André
  L. Fassone Canova <lonelywolf@blv.com.br> (revisão)