在我的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-8
,ru_RU.ISO-8859-5
)中,XFontSet
扩展功能完美,而在其他区域(ru_RU.UTF-8
,ru_RU
)没有(字体集中的个别字体不合适),导致Latin-1
平面以外的字符呈现不正确。
问题:
libXt
,libX11
)作为主要嫌疑人?XFontSet
)而不是常规字体(XFontStruct
)显示文本标签而不依赖于Motif - 理想情况下使用Athena小部件集? libX11
API,我的理解是否正确我应该尝试XmbDrawString() and XwcDrawString()系列函数?如果您有其他评论。代码,不直接回答上述问题,但可以帮助追踪问题 - 欢迎这些。
我特别感兴趣的是,无论当前的语言环境如何,都能正确显示西里尔语,前提是:
这给我留下了以下语言环境列表:
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 时发现了2个问题:
ru_RU
语言环境支持 在ru_RU.ISO-8859-5
区域设置中获取的参考渲染:
如您所见,无论使用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 :
出于某种原因,XFontSet
仅包含KOI8-R
字体而不是ISO-8859-5
字体:
-monotype-arial-medium-r-normal--12-90-100-100-p-0-koi8-r
Motif 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
区域设置中获取的参考渲染:
除了在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
语言环境中的内容相同:
尽管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
环境变量将被归咎于LANG
或LANG=C
或LANG=en_US.UTF-8
,正确显示西里尔字母),而LC_ALL
可以安全地设置为ru_RU.UTF-8
。
与Motif 2.2 相比,这是回归(版本 2.3.0 ,后来会受到影响)。