8

在我的 Motif 应用程序中(源代码在这里,需要 Motif 2.1 + ( -lXm -lXt -lX11) 和符合 C99 的编译器;在Cygwin上应该另外链接-liconv),我试图XFontSet从与编码无关的XLFD转换一个实例(如-monotype-arial-medium-r-normal--*-90-*-*-p-0-*-*)正确扩展为与当前语言环境匹配的多个单独XFontStruct条目(...-iso8859-1...-iso8859-5...-iso10646-1等)。

我发现在某些语言环境 ( en_US.UTF-8, ru_RU.ISO-8859-5) 中,XFontSet扩展效果很好,而在其他语言环境 ( ru_RU.UTF-8, ) 中ru_RU却没有(字体集中的个别字体不合适),导致平面上的字符以外的字符Latin-1呈现不正确。

问题:

  1. 如何排除 Motif 或 X11 客户端库 ( libXt, libX11) 作为主要嫌疑人?
  2. 特别是,(如何)我可以在不依赖 Motif 的情况下使用字体集 ( XFontSet) 而不是常规字体 ( ) 显示文本标签——最好使用 Athena 小部件集?XFontStruct
  3. 说到普通libX11API,我的理解是否正确我应该尝试XmbDrawString() 和 XwcDrawString()系列函数?

如果您有其他评论,请注册。代码,它不直接回答上述问题,但可以帮助追查问题——这些是受欢迎的。


TL;DR 版本

无论当前的语言环境如何,我都对正确显示西里尔文特别感兴趣,前提是:

  • X11 支持语言环境,并且
  • 西里尔文可在语言环境的字符集中表示。

这给我留下了以下语言环境列表:

  • ru_RU;
  • ru_RU.ISO-8859-5(应该与 ru_RU 相同,但不是,见下文);
  • ru_RU.KOI8-R;
  • ru_RU.CP1251;
  • ru_RU.UTF-8;
  • en_US.UTF-8以及任何xx_YY.UTF-8.

ru_RU, 在不失一般性的情况下, 可以很容易地替换为uk_UA,be_BYbg_BG.

在我的测试代码中,我正在XmLabel使用由不同XmStringCreate*()/XmStringGenerate()工厂方法生成的标签创建实例。

Motif 2.3.4通常显示出具有西里尔字母的能力,但有一些例外(或关于 Motif 2.1的回归)。我不确定回归是源于 Motif 本身 ( libXm) 还是 X11 客户端库 ( libXt, libX11)。X11 字体路径在所有测试中都相同,因此不应责怪特定的 X 服务器或 X 字体服务器。

基本上,我在使用 Motif 2.3.4时发现了两个问题:

ru_RU语言环境支持

在语言环境中获得的参考渲染ru_RU.ISO-8859-5

在 ru_RU.ISO-8859-5 语言环境中获得的参考渲染

如您所见,无论XmString使用何种工厂,完整的俄语字母都可以正确显示。

在这三种情况下,应用程序都将XFontSet实例的内容打印到标准输出:

locale: ru_RU.ISO-8859-5
run-time charset: ISO-8859-5
XmStringCreateLocalized():
    XmFONT_IS_FONTSET (ru_RU.ISO-8859-5): -monotype-arial-medium-r-normal--*-90-*-*-p-0-*-*, -monotype-arial-regular-r-normal--*-90-*-*-p-0-*-*
        -monotype-arial-medium-r-normal--12-90-100-100-p-0-iso8859-5
        -monotype-arial-medium-r-normal--12-90-100-100-p-0-iso8859-5
XmStringCreate():
    XmFONT_IS_FONTSET (ru_RU.ISO-8859-5): -monotype-arial-medium-r-normal--*-90-*-*-p-0-*-*, -monotype-arial-regular-r-normal--*-90-*-*-p-0-*-*
        -monotype-arial-medium-r-normal--12-90-100-100-p-0-iso8859-5
        -monotype-arial-medium-r-normal--12-90-100-100-p-0-iso8859-5
XmStringGenerate(XmCHARSET_TEXT):
    XmFONT_IS_FONTSET (ru_RU.ISO-8859-5): -monotype-arial-medium-r-normal--*-90-*-*-p-0-*-*, -monotype-arial-regular-r-normal--*-90-*-*-p-0-*-*
        -monotype-arial-medium-r-normal--12-90-100-100-p-0-iso8859-5
        -monotype-arial-medium-r-normal--12-90-100-100-p-0-iso8859-5

现在,在ru_RU语言环境中启动了相同的应用程序。主题2.2

在此处输入图像描述

由于某种原因,XFontSet只包含KOI8-R字体而不是ISO-8859-5字体:

-monotype-arial-medium-r-normal--12-90-100-100-p-0-koi8-r

主题2.3

在此处输入图像描述

在这种情况下,没有渲染任何内容,但XFontSet包含的字体比实际需要的多:

-monotype-arial-medium-r-normal--12-90-100-100-p-0-iso8859-1
-monotype-arial-medium-r-normal--12-90-100-100-p-0-koi8-r
-monotype-arial-medium-r-normal--12-90-100-100-p-0-microsoft-cp1251
-monotype-arial-medium-r-normal--12-90-100-100-p-0-iso8859-5
-monotype-arial-medium-r-normal--12-90-100-100-p-0-iso10646-1

这是与 Motif 2.1.0相比的回归(2.1.30及更高版本受到影响)。

ru_RU.UTF-8语言环境支持

在语言环境中获得的参考渲染en_US.UTF-8

在此处输入图像描述

除了XmString在 8 位模式下测试的 3 个工厂外,还进行了XmStringGenerate(XmMULTIBYTE_TEXT)额外测试。XFontSet包含以下条目(实际上XFontStruct是 Monotype Arial 字体的所有可能条目):

-monotype-arial-medium-r-normal--12-90-100-100-p-0-iso8859-1
-monotype-arial-medium-r-normal--12-90-100-100-p-0-iso8859-2
-monotype-arial-medium-r-normal--12-90-100-100-p-0-iso8859-3
-monotype-arial-medium-r-normal--12-90-100-100-p-0-iso8859-4
-monotype-arial-medium-r-normal--12-90-100-100-p-0-iso8859-5
-monotype-arial-medium-r-normal--12-90-100-100-p-0-koi8-r
-monotype-arial-medium-r-normal--12-90-100-100-p-0-iso8859-7
-monotype-arial-medium-r-normal--12-90-100-100-p-0-iso8859-9
-monotype-arial-medium-r-normal--12-90-100-100-p-0-iso8859-13
-monotype-arial-medium-r-normal--12-90-100-100-p-0-iso8859-15
-monotype-arial-medium-r-normal--12-90-100-100-p-0-iso10646-1

现在,在ru_RU.UTF-8语言环境中相同:

在此处输入图像描述

XFontStruct尽管XFontSetinstance 包含所有必要的条目,但似乎使用了不正确的XFontStruct条目:

-monotype-arial-medium-r-normal--12-90-100-100-p-0-iso8859-1
-monotype-arial-medium-r-normal--12-90-100-100-p-0-koi8-r
-monotype-arial-medium-r-normal--12-90-100-100-p-0-microsoft-cp1251
-monotype-arial-medium-r-normal--12-90-100-100-p-0-iso8859-5
-monotype-arial-medium-r-normal--12-90-100-100-p-0-iso10646-1

更新:事实证明,在ru_RU.UTF-8语言环境中,LANG环境变量应该受到指责(空的LANGorLANG=CLANG=en_US.UTF-8,西里尔字母显示正确),而LC_ALL可以安全地设置为ru_RU.UTF-8.

这是与 Motif 2.2相比的回归(2.3.0及更高版本受到影响)。

4

0 回答 0