XDrawString编码不正确

时间:2016-09-21 15:01:22

标签: c++ gcc x11 xlib

我想用XDrawString()显示西里尔符号,但在屏幕上显示错误的编码。

我已经在我的系统中安装了xfonts-cyrillic(ubuntu 14.04),但xlsfonts列表中的任何字体仍显示错误的结果。

我的代码(main.cpp):

#include <X11/Xlib.h>
#include <string.h>

int main(int, char**)
{
    Display *d = XOpenDisplay(0);
    Window r = DefaultRootWindow(d);
    Window w = XCreateSimpleWindow(d, r, 0, 0, 256, 256, 0, 0, 0xffffff);
    GC gc = DefaultGC(d, 0);

    XMapRaised(d, w);
    XSelectInput(d, w, ExposureMask);

    Font font = XLoadFont(d, "9x15-cyrillic");
    XSetFont(d, gc, font);

    const char *msg = "тут текст"; // cyrillic symbols

    while (1)
    {
        XEvent e;
        XNextEvent(d, &e);
        XDrawString(d, w, gc, 16, 16, msg, (int) strlen(msg));
    }
}

编译:

g++ -Wall -g -std=c++11 main.cpp -L/usr/lib/X11 -lX11 -o output

我的结果是:

enter image description here

为什么结果窗口文本编码错误?我缺少什么?

1 个答案:

答案 0 :(得分:6)

X11比Uicode早几千年(在互联网年代)。您的程序可能使用UTF-8,默认情况下X11不使用。试试Xutf8DrawString。

或者,找出你的字体使用哪些编码(xlsfonts会告诉你,因为编码是XLFD的一部分,但对我来说它看起来像KOI8-R)并使用该编码作为你的字符串。

应该注意的是,现在真正的程序很少使用服务器端字体。有关详细信息,请参阅this