在我的 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
呈现不正确。
问题:
- 如何排除 Motif 或 X11 客户端库 (
libXt
,libX11
) 作为主要嫌疑人? - 特别是,(如何)我可以在不依赖 Motif 的情况下使用字体集 (
XFontSet
) 而不是常规字体 ( ) 显示文本标签——最好使用 Athena 小部件集?XFontStruct
- 说到普通
libX11
API,我的理解是否正确我应该尝试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_BY
或bg_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
:
如您所见,无论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
尽管XFontSet
instance 包含所有必要的条目,但似乎使用了不正确的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
环境变量应该受到指责(空的LANG
orLANG=C
或LANG=en_US.UTF-8
,西里尔字母显示正确),而LC_ALL
可以安全地设置为ru_RU.UTF-8
.
这是与 Motif 2.2相比的回归(2.3.0及更高版本受到影响)。