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