我正在尝试在ISO-10646程序中使用X Window固定字体。它必须支持英语,俄语和希腊字母,但不支持。在xfontsel窗口中一切正常,但在我的程序中只有英文正确显示。使用g++ -fexec-charset=ISO-10646 ...g++ -finput-charset=ISO-10646 ...之类的方法无济于事。我该如何解决?

测试应用程序窗口截图:

c++ - ISO-10646 XFont编码问题-LMLPHP

xfontsel窗口截图:

c++ - ISO-10646 XFont编码问题-LMLPHP

测试应用程式程式码:

#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();
}

最佳答案

您的程序使用UTF-8编码的单字节字符串,这不是Xt/Xaw期望的。 -fexec-charset将无济于事。

使用纯Xlib(无工具包),您将使用Xutf8DrawString和friends,但是Xt和Xaw对此没有任何规定。

Xaw理论上支持将XtNencoding设置为XawTextEncodingChar2b的标签的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能力。将原始X11与Xutf8DrawString一起使用,或将其与Qt或Gtk或FLTK或wxWidgets等现代工具包结合使用,它们都应与UTF-8无缝兼容。作为最后的手段,可以根据需要对Xaw小部件进行子类化,并使其与Xutf8DrawString一起使用。

更新我已经检查了Gentoo ebuild的源文件,该文件应该是最新的。补丁未在此应用,到处都有strlenXChar2b无法正常工作。典型的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);
}

显然,这可能无法正确工作。

关于c++ - ISO-10646 XFont编码问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40123008/

10-10 17:29