web-dev-qa-db-fra.com

Comment détecter le codage actuel des caractères gnome-terminal?

J'essaie de détecter le codage de caractères gnome-terminal en cours à partir de la ligne de commande. J'ai essayé d'utiliser 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

Mais si je vais maintenant dans le menu gnome-terminal et que je choisis Terminal->Set Character Encoding->ISO-8859-10, puis je l'exécute à nouveau.

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

de sorte que le codage dans /apps/gnome-terminal/profiles/Default/encoding n'a pas changé pour ISO-8859-10 même si le terminal utilise ce codage. Il semble donc que gconftool ne puisse pas être utilisé pour déterminer le codage actuel.

3
Håkon Hægland

Je recommande de vérifier la sortie de locale charmap (qui rapporte les valeurs définies par $ LANG, $ LC_CTYPE, $ LC_ALL). Celui-ci n'interroge pas directement le terminal, mais il est essentiel pour la plupart des applications que les paramètres régionaux soient configurés correctement, de manière cohérente avec le terminal. S'il signale autre chose que le comportement réel, non seulement votre application, mais quasiment toutes les autres applications se comportent mal dans le terminal, et ce n'est pas votre faute. Bien sûr, l'utilisateur peut modifier l'encodage à partir du menu, mais s'il décide de se tirer une balle dans le pied, il n'y a pas grand chose que vous puissiez/devriez faire contre. Ce n'est pas à vous de détecter un paramètre système défectueux. De plus, vous ne pouvez pas remarquer si l'utilisateur modifie le codage pendant que votre application est en cours d'exécution. Je ne pense donc pas qu'il soit très utile de le vérifier au démarrage.

Si vous avez vraiment besoin de vérifier le comportement du moteur d'exécution, vous pouvez émettre des séquences d'échappement interrogeant la position du curseur (et les renvoyer dans un certain format comme si elles avaient été saisies au clavier), puis émettre des octets, par exemple. forme un seul caractère dans UTF-8 alors que plusieurs caractères dans tout autre codage (désactivation de l'écho local dans le temps moyen, afin que l'utilisateur n'appuie pas sur les touches du clavier pour faire avancer le curseur), puis interroge à nouveau la position du curseur. C'est peut-être trop de problèmes et ne vaut vraiment pas la peine.

2
egmont

Voici une demi-solution qui résout le problème de la détermination du codage lorsque /apps/gnome-terminal/profiles/Default/encoding est égal à la chaîne current. En supposant que la chaîne current signifie que gnome-terminal devrait utiliser les paramètres régionaux en cours.

Il est tentant de vérifier la variable LANG pour déterminer le codage, mais selon this question, cela n’est pas fiable. Au lieu de cela, le module Perl I18N::Langinfo devrait être utilisé:

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

Notez que cette réponse ne résout pas le problème de la détermination du codage gnome-terminal lorsque l'utilisateur modifie manuellement le codage à partir du menu gnome-terminal.

1
Håkon Hægland