gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 12:26:03 26 4
gpt4 key购买 nike

我正在尝试在我的 X Window 程序中使用 ISO-10646 固定字体。它必须支持英语、俄语和希腊字母,但事实并非如此。在 xfontsel 窗口中一切正常,但在我的程序中只有英语可以正确显示。使用类似 g++ -fexec-charset=ISO-10646 ...g++ -finput-charset=ISO-10646 ... 的东西没有帮助。我该如何解决?


测试应用窗口截图:

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

最佳答案

您的程序使用 UTF-8 编码的单字节字符串,这不是 Xt/Xaw 所期望的。 -fexec-charset 没有任何帮助。

对于纯 Xlib(无工具包),您可以使用 Xutf8DrawString 和 friend ,但 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 的国际化能力。将原始 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com