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 设置的值)。这个输出不会直接查询终端,但对于大多数应用程序来说,正确设置区域设置并与终端一致是至关重要的。如果它报告了实际行为以外的任何其他内容,那么不仅您的应用程序,而且几乎所有其他应用程序都会在终端中行为不当,这不是您的错。当然,用户可以从菜单中更改编码,但如果他们决定搬起石头砸自己的脚,您就无能为力了。检测错误的系统范围设置不是您的任务。此外,您无法注意到用户是否在应用程序运行时切换编码,因此我认为在启动时验证它没有什么意义。
如果您确实需要检查运行时行为,您可以发出转义序列来查询光标位置(并以某种格式报告,就像它是从键盘输入的一样),然后发出一些字节,例如,在 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
菜单手动更改编码时确定编码的问题。