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

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

Estou tentando detectar a gnome-terminalcodificação de caracteres 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 agora for ao gnome-terminalmenu e escolher Terminal->Set Character Encoding->ISO-8859-10e depois executar novamente

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

portanto, a codificação /apps/gnome-terminal/profiles/Default/encodingnão mudou, ISO-8859-10embora o terminal esteja usando essa codificação. Portanto, parece que gconftoolnão pode ser usado para determinar a codificação atual.

Responder1

Eu recomendo verificar locale charmapa saída de (que informa os valores definidos por $LANG, $LC_CTYPE, $LC_ALL). Este não consulta diretamente o terminal, mas é essencial para a maioria das aplicações que o código do idioma esteja configurado corretamente, de forma consistente com o terminal. Se ele relatar algo diferente do comportamento real, não apenas o seu aplicativo, mas praticamente todos os outros aplicativos se comportarão mal no terminal, e a culpa não é sua. É claro que o usuário pode alterar a codificação no menu, mas se decidir dar um tiro no próprio pé, não há muito que você possa/deva fazer contra. Não é sua tarefa detectar uma configuração defeituosa em todo o sistema. Além disso, não há como você perceber se o usuário muda a codificação enquanto seu aplicativo está em execução, então não acho que faça muito sentido verificá-lo na inicialização.

Se você realmente precisa verificar o comportamento do tempo de execução, você pode emitir sequências de escape que consultam a posição do cursor (e reportá-la em um determinado formato, como se tivesse sido digitado no teclado) e, em seguida, emitir alguns bytes que, por exemplo, formam um único caractere em UTF-8 enquanto vários caracteres em qualquer outra codificação (desativando o eco local nesse meio tempo, para que os pressionamentos de tecla do usuário não avancem o cursor) e consulte a posição do cursor novamente. Talvez seja muito problemático e realmente não valha o esforço.

Responder2

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 currentsignifique que gnome-terminaldeve usar o código do idioma atual.

É tentador verificar a LANGvariável para determinar a codificação, mas de acordo comessepergunta, isso não é confiável. Em vez disso, o módulo Perl I18N::Langinfodeve 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 esta resposta não aborda o problema de determinar a gnome-terminalcodificação quando o usuário altera manualmente a codificação no gnome-terminalmenu.

informação relacionada