Как определить текущую кодировку символов gnome-terminal?

Как определить текущую кодировку символов gnome-terminal?

Я пытаюсь определить текущую gnome-terminalкодировку символов из командной строки. Я пробовал использовать 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

Но если я сейчас зайду в gnome-terminalменю и выберу Terminal->Set Character Encoding->ISO-8859-10, а затем снова запущу

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

так что кодировка в /apps/gnome-terminal/profiles/Default/encodingне изменилась на ISO-8859-10хотя терминал использует эту кодировку. Так что, похоже, ее gconftoolнельзя использовать для определения текущей кодировки.

решение1

Я рекомендую проверить locale charmapвывод (который сообщает значения, установленные $LANG, $LC_CTYPE, $LC_ALL). Этот вывод не запрашивает напрямую терминал, но для большинства приложений важно, чтобы локаль была настроена правильно, в соответствии с терминалом. Если он сообщает что-то иное, чем фактическое поведение, не только ваше приложение, но и практически все остальные приложения будут вести себя неправильно в терминале, и это не ваша вина. Конечно, пользователь может изменить кодировку из меню, но если он решит выстрелить себе в ногу, вы мало что можете/должны сделать против этого. Это не ваша задача — обнаружить неисправную общесистемную настройку. Кроме того, у вас нет возможности заметить, что пользователь меняет кодировку во время работы вашего приложения, поэтому я не думаю, что есть большой смысл в проверке этого при запуске.

Если вам действительно очень нужно проверить поведение во время выполнения, вы можете выдать escape-последовательности, которые запрашивают позицию курсора (и сообщают об этом в определенном формате, как будто это было набрано с клавиатуры), затем выдать несколько байтов, которые, например, формируют один символ в UTF-8 и несколько символов в любой другой кодировке (отключая локальное эхо в то же время, чтобы нажатия клавиш пользователем не продвигали курсор), и снова запросить позицию курсора. Это, возможно, слишком хлопотно и действительно не стоит усилий.

решение2

Вот полурешение, решающее проблему определения кодировки, когда /apps/gnome-terminal/profiles/Default/encodingравно строке current. Предполагая, что строка currentозначает, что gnome-terminalследует использовать текущую локаль.

Возникает соблазн проверить LANGпеременную, чтобы определить кодировку, но согласноэтотвопрос, это не надежно. Вместо этого I18N::Langinfoследует использовать модуль Perl:

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

Обратите внимание, что этот ответ не решает проблему определения gnome-terminalкодировки, когда пользователь вручную меняет кодировку из gnome-terminalменю.

Связанный контент