Quais codificações de terminal são padrão no Linux e quais são mais comuns?

3

Eu preciso tomar uma decisão sobre se um programa comercial complicado no qual eu trabalho deve assumir uma codificação de terminal específica para o Linux, ou em vez disso, lê-lo no terminal (e se sim, como).

É muito fácil adivinhar qual sistema e codificações de terminal são mais comuns no Windows. Podemos supor que a maioria dos usuários os configura através do Painel de Controle, e que, por exemplo, sua codificação de terminal, que geralmente não é Unicode, pode ser facilmente prevista a partir da configuração padrão para esse idioma / país. (Por exemplo, em uma máquina em inglês dos EUA, será OEM-437, enquanto em uma máquina russa, será OEM-866.)

Mas não está claro para mim como a maioria dos usuários configura seu sistema e codificações de terminal no Linux. Os experientes que freqüentemente precisam usar caracteres não-ASCII provavelmente usam uma codificação UTF-8. Mas que proporção de usuários de Linux se enquadra nessa categoria?

Também não está claro qual método a maioria dos usuários usa para configurar sua localidade: alterando a variável de ambiente LANG ou outra coisa.

Uma questão relacionada seria como o Linux configura isso por padrão. Minha própria máquina Linux no trabalho (na verdade, uma máquina Debian virtual 5 que roda via VMWare Player na minha máquina Windows) é configurada por padrão para usar uma codificação de terminal US-ASCII. No entanto, não tenho certeza se isso foi configurado pelos administradores no meu local de trabalho ou se é esse o cenário inicial.

Por favor, entenda que não estou procurando respostas para "Qual codificação você usa pessoalmente?" mas sim alguns meios pelos quais eu poderia descobrir a distribuição de codificações que os usuários do Linux provavelmente usariam.

    
por Alan 03.02.2014 / 00:30

4 respostas

1

De configurações mais gerais a configurações específicas:

SO

O padrão em debian desde Etch em Apr 8th 2007 (11 anos atrás) foi utf-8.

Note : Fresh Debian/Etch installation have UTF8 enabled by default.

E confirmado nas notas de lançamento :

The default encoding for new Debian GNU/Linux installations is UTF-8. A number of applications will also be set up to use UTF-8 by default.

O que isto significa é que o debian (e o ubuntu, o mint e muitos outros) são utf-8 capazes por padrão.

locale

Qual codificação (e país) é realmente escolhida pelo usuário com o comando dpkg-reconfigure locales é deixado para as preferências do usuário.

Isso configura a configuração específica real do comando locale do computador:

$ locale
LANG=en_US.utf8
LANGUAGE=
LC_CTYPE="en_US.utf8"
LC_NUMERIC="en_US.utf8"
LC_TIME="en_US.utf8"
LC_COLLATE="en_US.utf8"
LC_MONETARY="en_US.utf8"
LC_MESSAGES="en_US.utf8"
LC_PAPER="en_US.utf8"
LC_NAME="en_US.utf8"
LC_ADDRESS="en_US.utf8"
LC_TELEPHONE="en_US.utf8"
LC_MEASUREMENT="en_US.utf8"
LC_IDENTIFICATION="en_US.utf8"
LC_ALL=

Todas essas "variáveis de ambiente" têm efeitos específicos em cada uma das seções de país / idioma (partes) como definido pela especificação POSIX .

tty

Mas as opções acima são apenas "gerais". Um terminal particular pode (ou não) combiná-lo. Bem, em geral, a codificação usual para a maioria dos terminais hoje é utf8.

A codificação para um terminal particular (tty) pode ser encontrada se definida para utf8 com:

$ stty -a | grep -o '.iutf8'
 iutf8

Ou seja, sem - antes do resultado ser impresso.

terminal

Mas a terminal (janela da GUI) dentro da qual o terminal tty está (normalmente) em execução também possui sua própria configuração de código de idioma. Se as configurações são sãs , provavelmente:

$ locale charmap
UTF-8

Terá a resposta correta.

Mas isso é apenas uma olhada rápida e superficial em todas as configurações do i18n do linux / unix.

Tirar: Provavelmente, supondo que o linux esteja usando utf8 é sua melhor aposta.

    
por 20.10.2018 / 05:29
2

Eu usaria uma heurística semelhante que você está usando com usuários do Windows, mas por meio da variável de ambiente LANG. Por exemplo, no meu sistema:

$ echo $LANG
en_US.UTF-8

Aqui, o código está dizendo que estou usando o idioma inglês, mas com codificação UTF-8 de nomes de arquivos e arquivos.

Como regra geral, os usuários de Linux que usam UTF-8 terão "UTF-8" no final de sua variável de ambiente LANG.

    
por 03.02.2014 / 01:19
1

Instalações modernas do Linux (por pelo menos 5 anos, provavelmente mais tempo) usam o UTF-8. Como isso é feito, definindo os valores de ambiente LC_CTYPE , LANG e LANGUAGE . Veja por exemplo as discussões aqui ou aqui (centralizado em Unicode).

    
por 03.02.2014 / 01:20
0

Para sistemas Linux / Unix razoavelmente modernos, você não precisa se preocupar com a codificação do terminal. Apenas use getwchar ou fgetws para ler stdin (ou o terminal). [Nota 1]

Como man getwchar diz, na seção Notes :

It is reasonable to expect that getwchar() will actually read a multibyte sequence from standard input and then convert it to a wide character.

Há uma observação semelhante em man fgetws .

Com o Linux, também é razoável esperar que a codificação de wchar_t seja unicode, independentemente da localidade. O padrão C99 permite que a implementação defina a macro __STDC_ISO_10646__ para indicar que os valores wchar_t correspondem aos pontos de código Unicode [Nota 2], portanto você pode inserir uma verificação em tempo de compilação para essa expectativa, que deve ser bem-sucedida Linux instala com toolchains padrão. É provável que tenha sucesso em sistemas Unix modernos, embora não haja garantia.

Notas:

[1] Você precisa inicializar a localidade chamando setlocale(LC_ALL, ""); uma vez no início da execução do programa. Veja man setlocale .

[2] O valor de __STDC_ISO_10646__ é uma data (no formato yyyymmL ) correspondente à data da versão aplicável do padrão Unicode. O texto preciso do padrão (rascunho) é:

The following macro names are conditionally defined by the implementation:

__STDC_ISO_10646__ An integer constant of the form yyyymmL (for example, 199712L). If this symbol is defined, then every character in the Unicode required set, when stored in an object of type wchar_t, has the same value as the short identifier of that character. The Unicode required set consists of all the characters that are defined by ISO/IEC 10646, along with all amendments and technical corrigenda, as of the specified year and month. If some other encoding is used, the macro shall not be defined and the actual encoding used is implementation-defined.

    
por 03.02.2014 / 02:52