我正在使用 X 应用程序通过 SSH 连接到某台机器。当我运行一个 X 应用程序时,比如说,xclock
为了简单起见,我会收到一条控制台消息:
Warning: Missing charsets in String to FontSet conversion
...但应用程序运行。我的语言环境是:
$ locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
现在,我发现这个旧建议只是 set export LC_ALL=C
。并且-有效,错误消息消失了。但是,我真的不想那样改变我的语言环境!
我可以做些什么来避免错误并保留我的语言环境吗?
附加信息:
- X 服务器是 MobaXterm 在 Windows 上的集成 X 服务器。
- 远程机器是 SLES GNU/Linux 11(由 SUSE)。
你是对的,你不想那样改变你的语言环境!我找到了类似的建议,并选择了兔子洞。
您可以更改的单个语言环境变量是
LC_CTYPE=C
(这是字符分类设置,有关详细信息,请参阅POSIX第 7 节,语言环境)。我认为,这里的主要问题是旧的 X 程序在当代多字节/多语言环境系统中存在与字体相关的小问题。
我自己的语言环境,在桌面 X Org(Mobaterm 在后台使用 X Org)是(通过
en_IE.utf
映射到文件)。在那个 XLC_LOCALE 文件中有字体集和字符集定义,并且其中一些(倾向于)触发警告(特别是对于我不使用的西里尔文和亚洲编码,并且没有很好的字体覆盖率) )。en_US.UTF-8/XLC_LOCALE
/usr/share/X11/locale/locale.dir
我从一些程序中得到了几个错误,例如
xfig
:注释掉各种不需要的
fsN
条目csN
将解决这个问题(每个索引 N 定义一个匹配的字体集/字符集对,保持这种配对,注意每对相隔约 200 行)。这可能会影响某些文本的呈现。或者,LC_CTYPE=C
在开始之前设置xfig
会删除所有警告。由于报告缺少字符集(即语言环境使用/要求的字符集,但在与请求的规范匹配的字体中未找到),因此从
XtCvtStringToFontSet()
(libXt)发出警告。XCreateFontSet()
XCreateFontSet()
返回丢失字符集的列表,但 libXt 不输出请求的详细信息或丢失的字符集以帮助您跟踪它。LD_PRELOAD
(我使用和包装器.so
作弊以XCreateFontSet()
找到罪魁祸首,见下文。)那么真正的问题是字体规范(例如“ --helvetica-medium-r-normal--16- - - - - - - ”)检查文件中设置的所有编码,
XLC_LOCALE
如果有些不能被发现然后你会看到这些警告。如果根本找不到,您也会看到“警告:无法加载任何可用的字体集”。然后进行一些修复:
LC_CTYPE=C
(或其他“简单”编码,例如)en_US
您可能需要最后两个修复程序,因为如果任何默认字体在检查时与编码不匹配,即使后续字体就足够了,也会发出警告。
最后一个问题是一些后备字体规范可能会继续引发问题。具体来说,硬编码的 Xt 默认为:
可能无法完全触发相同的警告。一些快速测试表明,不包含系列(仅包括单个“*”)的字体规范可能不匹配任何内容,即使预期匹配,即:
并且添加尾随“,*”作为完整的通配符可能会破坏原本可以工作的字体规范。在 X Org 1.18.3 上观察到。
我在我的
.Xdefaults
:这对我来说似乎让大多数事情保持安静,不需要
XLC_LOCALE
改变。这个后备设法匹配我以某种方式增加的字体混杂中的每个请求的编码......这是我用来帮助跟踪请求的内容(因为它通常只在应用程序源中定义)和未找到的内容的非常简单的包装器(具有最少的错误检查)。在 x86_64 Slackware 上测试,其他发行版/系统可能需要微调。
然后
从编译它的目录运行它。