私の Motif アプリケーション (ソース コードはここにあります。Motif 2.1 + ( -lXm -lXt -lX11
) と C99 準拠のコンパイラが必要です。Cygwin では、さらにとリンクする必要があります) で、エンコーディングに依存しないXLFD (のような)から変換されたインスタンス-liconv
を取得しようとしています。現在のロケールに一致する複数の個々のエントリ ( 、、など)に正しく展開されます。XFontSet
-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 に依存せずに (理想的には Athena ウィジェット セットを使用して)
XFontSet
通常のフォント ( ) ではなくフォント セット ( ) を使用してテキスト ラベルを表示できますか?XFontStruct
- プレーンな API といえば、XmbDrawString() および XwcDrawString()ファミリの関数
libX11
を試す必要があるという私の理解は正しいですか?
追加のコメントがある場合は、登録してください。上記の質問に直接答えることはありませんが、問題を追跡するのに役立つコード - それらは大歓迎です。
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の使用時に 2 つの問題が見つかりました。
ru_RU
ロケールのサポート
ru_RU.ISO-8859-5
ロケールで取得した参照レンダリング:
ご覧のように、XmString
使用されている工場に関係なく、完全なロシア語のアルファベットが正しく表示されます。
3 つのケースのそれぞれで、アプリケーションは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
モチーフ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
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
orをLANG=C
使用してLANG=en_US.UTF-8
、キリル文字が正しく表示されますLC_ALL
) ru_RU.UTF-8
。
これは、Motif 2.2と比較したリグレッションです(バージョン2.3.0以降が影響を受けます)。