特定于语言环境的XFontSet扩展

时间:2016-05-16 13:28:26

标签: c fonts localization x11 motif

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

我发现在某些区域设置(en_US.UTF-8ru_RU.ISO-8859-5)中,XFontSet扩展功能完美,而在其他区域(ru_RU.UTF-8ru_RU)没有(字体集中的个别字体不合适),导致Latin-1平面以外的字符呈现不正确。

问题:

  1. 如何排除Motif或X11客户端库(libXtlibX11)作为主要嫌疑人?
  2. 特别是,(如何)我可以使用字体集(XFontSet)而不是常规字体(XFontStruct)显示文本标签而不依赖于Motif - 理想情况下使用Athena小部件集?
  3. 说到普通的libX11 API,我的理解是否正确我应该尝试XmbDrawString() and XwcDrawString()系列函数?
  4. 如果您有其他评论。代码,不直接回答上述问题,但可以帮助追踪问题 - 欢迎这些。

    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
    {p> ru_RU可以轻松替换为uk_UAbe_BYbg_BG

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

    Motif 2.3.4 一般表现出具有西里尔语能力,但有少数例外(或者关于Motif 2.1 的回归)。我不确定回归是否来自Motif本身(libXm)或X11客户端库(libXtlibX11)。 X11字体路径在所有测试中都是相同的,因此不应该责怪特定的X服务器或X字体服务器。

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

    ru_RU语言环境支持

    ru_RU.ISO-8859-5区域设置中获取的参考渲染

    Reference rendering obtained in ru_RU.ISO-8859-5 locale

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

    在这三种情况中,应用程序都会将XFontSet实例的内容打印到stdout:

    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

    enter image description here

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

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

    Motif 2.3

    enter image description here

    在这种情况下,没有任何内容呈现,而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区域设置中获取的参考渲染

    enter image description here

    除了在8位模式下测试的3个XmString工厂外,还对XmStringGenerate(XmMULTIBYTE_TEXT)进行了测试。 XFontSet包含以下条目(实际上,Monotype Arial字体的所有可能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-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语言环境中的内容相同:

    enter image description here

    尽管XFontStruct实例包含所有必需的XFontSet条目,但似乎使用了不正确的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环境变量将被归咎于LANGLANG=CLANG=en_US.UTF-8,正确显示西里尔字母),而LC_ALL可以安全地设置为ru_RU.UTF-8

    与Motif 2.2 相比,这是回归(版本 2.3.0 ,后来会受到影响)。

0 个答案:

没有答案