收到“警告:字符串到 FontSet 转换中缺少字符集”

ein*_*lum 7 locale x-server utf-8

我通过 SSH 连接到某些机器来使用 X 应用程序。当我运行 X 应用程序时,例如,xclock为简单起见,我收到一条控制台消息:

Warning: Missing charsets in String to FontSet conversion
Run Code Online (Sandbox Code Playgroud)

...但应用程序运行。我的区域设置是:

$ 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=
Run Code Online (Sandbox Code Playgroud)

现在,我发现这个旧建议只需设置export LC_ALL=C. 并且 - 这有效,错误消息消失了。但是,我真的不想那样改变我的语言环境!

我可以做些什么来避免错误并保留我的区域设置吗?

附加信息:

  • X 服务器是 MobaXterm 在 Windows 上集成的 X 服务器。
  • 远程计算机是 SLES GNU/Linux 11(由 SUSE 提供)。

mr.*_*tic 5

你是对的,你不想那样改变你的区域设置!我发现了类似的建议,并选择了兔子洞。

您可以更改的单个区域设置变量是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

Warning: Missing charsets in String to FontSet conversion
Warning: Missing charsets in String to FontSet conversion
Warning: Unable to load any usable fontset
Run Code Online (Sandbox Code Playgroud)

注释掉各种不需要的fsNcsN条目将解决这个问题(每个索引 N 定义一个匹配的字体集/字符集对,维护此配对,注意每对相距约 200 行)。这可能会影响某些文本的呈现。或者,LC_CTYPE=C在开始之前进行设置xfig会删除所有警告。

XtCvtStringToFontSet()由于XCreateFontSet()报告缺少字符集(即语言环境使用/所需的字符集,但在与请求的规范匹配的字体中找不到),从 (libXt) 发出警告。

XCreateFontSet()返回缺失字符集的列表,但 libXt 不会输出请求或缺失字符集的详细信息来帮助您追踪。(我使用了LD_PRELOAD一个包装器.soXCreateFontSet()寻找罪魁祸首,见下文。)

那么真正的问题是,检查文件中设置的所有编码的字体规范(例如“- -helvetica-medium-r-normal--16- - - - - - -XLC_LOCALE ”) ,如果有些编码不能找到然后你会看到这些警告。如果根本找不到,您也会看到“警告:无法加载任何可用的字体集”。

然后进行一些修复:

  1. 设置LC_CTYPE=C(或其他“简单”编码,例如en_US)用于错误程序
  2. 从有效的 XLC_LOCALE 文件(区域设置)中删除不需要的字体集/字符集对,这无需重新启动 X 或桌面即可生效
  3. 安装更多字体和编码(类似于打地鼠游戏)
  4. 设置更慷慨的应用程序字体规范(通过 xrdb 或命令行)
  5. 设置更慷慨的默认字体规范(通过 xrdb)

您可能需要最后两个修复,因为如果任何默认字体在检查时与编码不匹配,即使后续字体就足够了,也会发出警告。

最后一个问题是某些后备字体规范可能会继续触发该问题。具体来说,硬编码的 Xt 默认值为:

-*-*-*-R-*-*-*-120-*-*-*-*,*
Run Code Online (Sandbox Code Playgroud)

可能会完全失败而触发相同的警告。一些快速测试表明,不包含系列(仅包括单个“*”)的字体规范可能不匹配任何内容,即使预期匹配,即:

Warning: Missing charsets in String to FontSet conversion
Warning: Missing charsets in String to FontSet conversion
Warning: Unable to load any usable fontset
Run Code Online (Sandbox Code Playgroud)

添加尾随“,*”作为完整通配符可能会破坏本来可以工作的字体规范。在 X Org 1.18.3 上观察到。

我在我的.Xdefaults

XtDefaultFontSet: -*-fixed-medium-r-normal--16-*-*-*-*-*-*-*,-*-fixed-*-*-*--16-*,-*-*-medium-*-*--16-*
Run Code Online (Sandbox Code Playgroud)

这对我来说似乎让大多数事情保持安静,不需要任何XLC_LOCALE改变。这个后备设法匹配我以某种方式积累的字体混合中的每个请求的编码......


这是一个非常简单的包装器(具有最少的错误检查),我用来帮助跟踪所请求的内容(因为它通常仅在应用程序源中定义)以及未找到的内容。在 x86_64 Slackware 上进行测试,其他发行版/系统可能需要进行细微调整。

-*-*-*-R-*-*-*-120-*-*-*-*,*
Run Code Online (Sandbox Code Playgroud)

然后

xlsfonts -fn "*-*-*-R-*-*-*-120-*-*-*-*"
Run Code Online (Sandbox Code Playgroud)

从您编译它的目录运行它。

XtDefaultFontSet: -*-fixed-medium-r-normal--16-*-*-*-*-*-*-*,-*-fixed-*-*-*--16-*,-*-*-medium-*-*--16-*
Run Code Online (Sandbox Code Playgroud)