8

私の 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-8ru_RU.ISO-8859-5) ではXFontSet拡張が完全に機能し、他のロケール ( ru_RU.UTF-8、 )ru_RUでは機能しない (フォントセット内の不適切な個々のフォント) ことがわかりました。その結果、平面の文字以外の文字がLatin-1正しくレンダリングされません。

質問:

  1. Motif または X11 クライアント ライブラリ ( libXtlibX11) を主な容疑者として除外するにはどうすればよいですか?
  2. 特に、(どのように) Motif に依存せずに (理想的には Athena ウィジェット セットを使用して)XFontSet通常のフォント ( ) ではなくフォント セット ( ) を使用してテキスト ラベルを表示できますか?XFontStruct
  3. プレーンな 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_UAbe_BYまたはに簡単に置き換えることができますbg_BG

私のテスト コードでは、異なる/ファクトリ メソッドXmLabelによって生成されたラベルを持つインスタンスを作成しています。XmStringCreate*()XmStringGenerate()

Motif 2.3.4は、いくつかの例外 (または Motif 2.1に関する回帰) を除いて、一般的にキリル文字に対応していることが示されています。リグレッションが Motif 自体 ( ) に起因するのか、libXmX11 クライアント ライブラリ ( libXtlibX11) に起因するのかはわかりません。X11 フォント パスはすべてのテストで同じだったので、特定の X サーバーまたは X フォント サーバーのせいではありません。

基本的に、Motif 2.3.4の使用時に 2 つの問題が見つかりました。

ru_RUロケールのサポート

ru_RU.ISO-8859-5ロケールで取得した参照レンダリング:

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-RISO-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ロケールで取得した参照レンダリング:

ここに画像の説明を入力

XmString8 ビット モードでテストされた 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にもかかわらず、間違ったものが使用されているようです。XFontSetXFontStruct

-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環境変数が原因であることがわかります (空のLANGorをLANG=C使用してLANG=en_US.UTF-8、キリル文字が正しく表示されますLC_ALL) ru_RU.UTF-8

これは、Motif 2.2と比較したリグレッションです(バージョン2.3.0以降が影響を受けます)。

4

0 に答える 0