2016-10-19 7 views
2

X Windowプログラムで固定フォントISO-10646を使用しようとしています。英語、ロシア語、ギリシャ語の文字をサポートしなければならないが、それはサポートしていない。 xfontselウィンドウではすべてOKですが、私のプログラムでは英語が正しく表示されます。 g++ -fexec-charset=ISO-10646 ...g++ -finput-charset=ISO-10646 ...のようなものを使用すると役に立ちませんでした。どうすれば修正できますか?ISO-10646 Xフォントのエンコードの問題


テストアプリケーションウィンドウのスクリーンショット:

Test app window screenshot


xfontselウィンドウのスクリーンショット:

xfontsel window screenshot


テストアプリコード:

#include <X11/StringDefs.h> 
#include <X11/Xaw/Command.h> 

int main(int argc, char **argv) { 
    Widget widget = XtInitialize(argv[0], "simple", NULL, 0, &argc, argv); 
    XtVaCreateManagedWidget(
     "English Русский ελληνικά", labelWidgetClass, widget, 
     XtNfont, XLoadQueryFont(XtDisplay(widget), 
      "-Misc-Fixed-Medium-R-Normal--20-200-75-75-C-100-ISO10646-1" 
     ), XtNwidth, 500, XtNheight, 100, NULL 
    ); 
    XtRealizeWidget(widget); 
    XtMainLoop(); 
} 

答えて

1

あなたのプログラムはXtの/のXawが期待するものではありませんUTF-8でエンコードされたシングルバイト文字列を、使用しています。 -fexec-charsetは役に立ちません。

純粋なXlib(ツールキットなし)の場合、Xutf8DrawStringと友人が使用されますが、XtとXawにはそれがありません。

Xawは理論的にはXtNencodingXawTextEncodingChar2bに設定したラベルの2バイトエンコードをサポートしていますが、UTF-16で動作させることはできません。

XChar2b lbl[] = { {0x04, 0x40}, {0x04, 0x43}, 
         {0x04, 0x41}, {0x04, 0x41}, 
         {0x04, 0x3a}, {0x04, 0x38}, 
         {0x04, 0x39}, {0, 0}}; 

    XtVaCreateManagedWidget(
    "w00t", labelWidgetClass, widget, 
    XtNfont, XLoadQueryFont(XtDisplay(widget), 
     "-Misc-Fixed-Medium-R-Normal--20-200-75-75-C-100-ISO10646-1" 
    ), XtNwidth, 500, XtNheight, 100, 
    XtNencoding, XawTextEncodingChar2b, 
    XtNlabel, lbl, 
    NULL 
); 

この特定の文字列が機能します。私は、あなたが任意のラベルを作成する方法を理解することができることを願っています。ただし、高位または低位のいずれかのヌルバイトで文字列が終了するため、このメソッドでは英語のテキストを表示できません。

私のマシン上のXawのコピーがおそらく最新ではありません。 hereが動作するはずのパッチがありますが、このコピーに適用されているかどうかわかりませんし、ソースからパッチを当てたバージョンを構築するのに気にすることもできません。すべてのマシンに最新のXawライブラリがあるわけではないので、コードを動的にリンクして配布したい場合は、それに頼るべきではありません。このパッチは2014年に作成されました。

私の助言は、Xawのi18n能力に依存しないことです。 Xutf8DrawStringで生のX11を使用するか、QtやGtk、FLTK、wxWidgetsなどの最新のツールキットを使用してください。すべてUTF-8でシームレスに動作するはずです。最後の手段として、必要に応じてXawウィジェットをサブクラス化し、Xutf8DrawStringで動作させます。

更新私は、最新のはずのGentoo ebuildからソースをチェックしました。パッチはそこには適用されていません。どこでもstrlenがあり、XChar2bは機能しません。典型的なXawコードフラグメント:

len = strlen(label); 
... 
if (len) { 
    if (w->label.encoding) 
     XDrawString16(XtDisplay(gw), XtWindow(gw), gc, 
       w->label.label_x, y, (XChar2b *)label, len/2); 
    else 
     XDrawString(XtDisplay(gw), XtWindow(gw), gc, 
       w->label.label_x, y, label, len); 
} 

明らかに、これは正しく動作することを期待できません。