Como detectar a codificação de caracteres do terminal gnome atual?

2

Estou tentando detectar a codificação de caractere gnome-terminal atual na linha de comando. Eu tentei usar gconftool :

$ gconftool-2 --get /apps/gnome-terminal/profiles/Default/encoding
current
$ gconftool-2 --type string --set /apps/gnome-terminal/profiles/Default/encoding
en_US.UTF-8
$ gconftool-2 --get /apps/gnome-terminal/profiles/Default/encoding
en_US.UTF-8

Mas se eu for agora para o menu gnome-terminal , escolha Terminal->Set Character Encoding->ISO-8859-10 e execute novamente

$ gconftool-2 --get /apps/gnome-terminal/profiles/Default/encoding
en_US.UTF-8

, portanto, a codificação em /apps/gnome-terminal/profiles/Default/encoding não foi alterada para ISO-8859-10 , embora o terminal esteja usando essa codificação. Portanto, parece que gconftool não pode ser usado para determinar a codificação atual.

    
por Håkon Hægland 20.06.2015 / 17:06

2 respostas

1

Eu recomendo verificar a saída de locale charmap (que relata os valores definidos por $ LANG, $ LC_CTYPE, $ LC_ALL). Este não consulta diretamente o terminal, mas é essencial para a maioria dos aplicativos que o código de idioma esteja configurado corretamente, consistentemente com o terminal. Se ele relatar qualquer outra coisa além do comportamento real, não apenas seu aplicativo, mas praticamente todos os outros aplicativos se comportarão mal no terminal, e não é sua culpa. Claro que o usuário pode mudar a codificação do menu, mas se eles decidirem se atirar no pé, não há muito o que você pode / deve fazer contra. Não é sua tarefa detectar uma configuração com falha no sistema. Além disso, não há como você perceber se o usuário alterna a codificação enquanto seu aplicativo está em execução, portanto, não acho que seja importante verificar isso na inicialização.

Se realmente precisar verificar o comportamento do tempo de execução, você pode emitir seqüências de escape que consultam a posição do cursor (e relatá-lo em um determinado formato como se ele tivesse sido digitado no teclado) e emitem alguns bytes forma um único caractere em UTF-8 enquanto vários caracteres em qualquer outra codificação (desabilitando o eco local no tempo médio, de forma que as teclas pressionadas pelo usuário não avançam o cursor), e consulta a posição do cursor novamente. Talvez seja muito trabalhoso e realmente não vale o esforço.

    
por egmont 23.06.2015 / 19:53
0

Aqui está uma meia solução, abordando o problema de determinar a codificação quando /apps/gnome-terminal/profiles/Default/encoding é igual à string current . Supondo que a string current signifique que gnome-terminal deve usar a localidade atual.

É tentador verificar a variável LANG para determinar a codificação, mas de acordo com esta questão, que não é confiável. Em vez disso, o módulo% PerlI18N::Langinfo deve ser usado:

temp=$(gconftool-2 --get /apps/gnome-terminal/profiles/Default/encoding)

if [[ $temp == "current" ]] ; then
    perl -MI18N::Langinfo=langinfo,CODESET -E 'say langinfo(CODESET())'
else
    echo $temp
fi

Observe que essa resposta não resolve o problema de determinar a codificação gnome-terminal quando o usuário altera manualmente a codificação do menu gnome-terminal .

    
por Håkon Hægland 20.06.2015 / 23:35