Codificação de entrada do teclado

Codificação de entrada do teclado

Estou tentando aprender o básico de Unicode e UTF-8, e tudo está indo muito bem até agora. Eu sei que é possível escolher a codificação de um arquivo ao abri-lo.

Quando digito texto usando o teclado em um editor de texto (EditarouVim) ou um prompt de comando, qual é a codificação que está sendo enviada pelo teclado para a aplicação? É diferente em máquinas Windows? Pode ser configurado?

Responder1

VerComo funcionam a entrada do teclado e a saída de texto?para uma visão geral do tema. Depende se o aplicativo está sendo executado em um terminal ou se comunicando diretamente com o ambiente GUI.

Em um terminal, o software do terminal (geralmente um emulador de terminal neste século) determina a codificação dos caracteres. Ele transmite a codificação de caracteres (a mesma para entrada e saída) definindo olocalidadevariável de ambiente LC_CTYPE. Se esta variável não estiver definida ou definida como C, o terminal não fornecerá nenhuma informação, portanto o aplicativo não poderá saber qual é a codificação. Em um terminal, os caracteres são enviados ao aplicativo como caracteres; entrada sem caracteres (teclas de função, teclas de cursor, teclas com modificadores como Alt, etc.) é enviada comosequências de escape(alguns deles comopersonagens de controleem vez de).

X11aplicativos recebem entrada na forma deEventos KeyPress. Os eventos KeyPresss contêm uma indicação de baixo nível ( keycodeque corresponde aproximadamente à localização física da tecla e stateque codifica os modificadores ativos). O aplicativo pode chamar uma função comoXLookupString(função tradicional, limitada ao Latin-1) ouXmbLookupString(função que suporta outras codificações unibyte) ouXwcLookupString(função que suporta codificações multibyte) ouXutf8LookupString(função UTF-8 moderna) para converter essas informações brutas em uma sequência de caracteres.

O mapeamento de chaves para caracteres pode ser alterado em vários níveis;Como funcionam a entrada do teclado e a saída de texto?tem uma visão geral.

Responder2

O teclado não envia caracteres; ele envia códigos de varredura. Por exemplo, quando você pressiona a tecla “e” em um teclado americano típico, ele envia um código de varredura que basicamente diz “3ª tecla da esquerda na 2ª linha de teclas alfanuméricas no grupo principal”. Este código de varredura é convertido em um caractere (ou em geral em um símbolo de chave, pense em teclas como "Print Screen") pelo kernel (ou algum outro componente do sistema operacional) e, especificamente no Linux, possivelmente pelo gráfico subsistema.

Geralmente o sistema operacional ou o subsistema gráfico fornece um ou mais utilitários que controlam as tabelas de conversão; por exemplo, tanto no Windows quanto no Linux você pode instalar quantos layouts de teclado desejar e alternar entre eles com facilidade.

O que o aplicativo obtém depende das convenções do sistema operacional. No Windows, os aplicativos de console obtêm um caractere codificado de acordo com a página de código do console atual definida pelo comando chcp; aplicativos gráficos obtêm um símbolo de chave que geralmente é traduzido em um caractere codificado em UTF-16. No Linux, os aplicativos geralmente recebem um caractere codificado em UTF-8. Por exemplo, se eu pressionar a tecla rotulada ă(LATIN SMALL LETTER A WITH BREVE, U+0103) com o layout do teclado definido corretamente,

  • Um aplicativo de console no Windows chcp 1250receberá um byte '\xE3'(227 decimal).
  • Um aplicativo de console no Windows chcp 852receberá um byte '\xC7'(199 decimal).
  • Um aplicativo gráfico no Windows obterá um símbolo de chave adequado, que geralmente será armazenado/processado como dois bytes '\x03' '\x01'(ou como um número inteiro curto 0x103).
  • Um aplicativo de terminal no Linux receberá dois bytes '\xC4' '\x83'(<U+0103> na codificação UTF-8).
  • Uma aplicação gráfica no Linux obterá um símbolo de chave adequado, que normalmente será armazenado/processado como dois bytes '\xC4' '\x83'(<U+0103> na codificação UTF-8).

(Observe que por Windows quero dizer Windows NT e seus sucessores, como Windows XP, Windows Vista, 7 ou 10. Windows 95 etc. são uma linha totalmente diferente de sistemas operacionais, felizmente não mais em uso.)

No Vim você obtém duas novas camadas de tradução:

  • Você pode instalar um mapa de tradução do teclado com set keymap; veja :help 'keymap'e :help mbyte-keymap. Isso ajuda a inserir texto no idioma desejado em sistemas onde não é possível instalar um layout de teclado no nível do sistema operacional.

  • Você pode definir um mapeamento com o :mapcomando. Ver :help :map.

informação relacionada