Como obter a codificação de caracteres do terminal

116

Agora eu mudo a codificação de caracteres do meu terminal gnome para "GBK" (o padrão é UTF-8), mas como posso obter o valor (codificação de caracteres) no meu Linux?

Liang Wul
fonte

Respostas:

108

O terminal usa variáveis ​​de ambiente para determinar qual conjunto de caracteres usar, portanto, você pode determinar olhando para essas variáveis:

echo $LC_CTYPE

ou

echo $LANG
Valdis
fonte
4
Essas variáveis ​​de ambiente são usadas por aplicativos que usam o terminal para E / S. O emulador de terminal em si não tem nenhum conhecimento sobre eles, e sua codificação de caracteres atualmente efetiva é uma configuração em algum lugar dentro do programa do emulador (um membro de dados dentro de uma classe libvte no caso do Terminal GNOME).
JdeBP
a ordenação das variáveis ​​sugeridas aqui não é boa. uma solução mais completa seria algo como: echo $ {LC_ALL: - $ {LC_CTYPE: - $ {LANG}}}. então, novamente, a variável sendo definida não é uma garantia de que eles são válidos, então você deve se ater ao localeprograma (como visto em outras respostas aqui).
Mike Frysinger
Como disse @JdeBP, o terminal não usa as localevariáveis ​​de ambiente para determinar sua codificação. O terminal pode, entretanto, permitir que os aplicativos que interagem com ele saibam sua codificação, definindo as localevariáveis ​​de ambiente. Por exemplo, no MacOS você pode escolher a codificação do terminal e, opcionalmente, definir as localevariáveis de ambiente na inicialização do terminal Terminal> Preferences> Profiles> Advanced.
Maggyero
97

locale O comando sem argumentos imprimirá os valores de todas as variáveis ​​de ambiente relevantes, exceto LANGUAGE.

Para codificação atual:

locale charmap

Para localidades disponíveis:

locale -a

Para codificações disponíveis:

locale -m
Nyzm
fonte
1
Isso é o que funcionou para mim em um sistema CentOS. Ele mostrou a codificação do sistema com base nas configurações de idioma atuais. As configurações do terminal usadas para chegar a essa máquina são uma história diferente e uma função do cliente que está sendo usado.
Phil DD
45

Verifique a codificação e o idioma:

$ echo $LC_CTYPE
ISO-8859-1
$ echo $LANG
pt_BR

Obtenha todos os idiomas:

$ locale -a

Mude para pt_PT.utf8:

$ export LC_ALL=pt_PT.utf8 
$ export LANG="$LC_ALL"
Moreno
fonte
16

Se você tiver Python:

python -c "import sys; print(sys.stdout.encoding)"
Martin Thoma
fonte
1
De todas as ofertas acima, a única sugestão que funcionou no meu Slackware64 v. 14.2 caixa foi este snippet de python. Obrigado!
Thomas Altfather Good
6

Que eu saiba, não.

Indicações de circunstanciais $LC_CTYPE, localee tal pode parecer sedutoras, mas estes são completamente separado do que codifica para a aplicação de terminal (na verdade, um emulador) passa a ser utilizado quando a exibição de caracteres sobre a tela.

A única maneira de detectar a codificação com certeza é gerar algo apenas presente na codificação, por exemplo ä, tirar uma captura de tela, analisar essa imagem e verificar se o caractere de saída está correto.

Então não, infelizmente não é possível.

pythonator
fonte
0

Para ver as informações de localidade atuais, use o localecomando. Abaixo está um exemplo no RHEL 7.8

[usr@host ~]$ locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
Ashish Bhosle
fonte