Estou tentando detectar a gnome-terminal
codificaçã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-terminal
menu e escolher Terminal->Set Character Encoding->ISO-8859-10
e 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/encoding
não mudou, 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.
Responder1
Eu recomendo verificar locale charmap
a 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 current
signifique que gnome-terminal
deve usar o código do idioma atual.
É tentador verificar a LANG
variável para determinar a codificação, mas de acordo comessepergunta, isso não é confiável. Em vez disso, o módulo Perl I18N::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 esta resposta não aborda o problema de determinar a gnome-terminal
codificação quando o usuário altera manualmente a codificação no gnome-terminal
menu.