如何检测当前的 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-10gconftool

答案1

我建议检查locale charmap的输出(报告由 $LANG、$LC_CTYPE、$LC_ALL 设置的值)。这个输出不会直接查询终端,但对于大多数应用程序来说,正确设置区域设置并与终端一致是至关重要的。如果它报告了实际行为以外的任何其他内容,那么不仅您的应用程序,而且几乎所有其他应用程序都会在终端中行为不当,这不是您的错。当然,用户可以从菜单中更改编码,但如果他们决定搬起石头砸自己的脚,您就无能为力了。检测错误的系统范围设置不是您的任务。此外,您无法注意到用户是否在应用程序运行时切换编码,因此我认为在启动时验证它没有什么意义。

如果您确实需要检查运行时行为,您可以发出转义序列来查询光标位置(并以某种格式报告,就像它是从键盘输入的一样),然后发出一些字节,例如,在 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菜单手动更改编码时确定编码的问题。

相关内容