我想用XDrawString()
显示西里尔符号,但是在屏幕上它们以错误的编码显示。
我已经在系统(ubuntu 14.04)中安装了xfonts-cyrillic
,但是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
我的结果是:
为什么结果窗口中的文本编码错误?我想念的是什么?
最佳答案
X11比Unicode早了几千年(在Internet年代)。您的程序可能使用UTF-8,默认情况下不使用X11。尝试Xutf8DrawString。
或者,找出字体使用的编码(xlsfonts会告诉您,因为编码是XLFD的一部分,但对我来说看起来像KOI8-R),然后对字符串使用该编码。
应当指出,如今,真正的程序很少使用服务器端字体。有关更多信息,请参见this。