如何使用X11系统在TCL / TK中呈现Unicode字符

时间:2019-05-01 09:53:54

标签: tcl x11 tk xlib

我正在尝试渲染Unicode字符以在TCL / TK中绘制剪刀标记(✂)

我正在使用X11 API“ void XwcDrawString(Display * display,Drawable d,XFontSet font_set,GC gc,int x,int y,wchar_t * string,int num_wchars)”

/* This is my code */

setlocale(LC_ALL, "");

wchar_t scr = 0x2702;
char *fontname;
fontname = (char *)malloc(strlen("ISO10646-1") + 3);
if (fontname) sprintf(fontname, "%s,*", "ISO10646-1");
else fontname = ",*";

char **missing_charset_list_return;
int missing_charset_count_return;
char *def_string_return;
XFontSet font_set = XCreateFontSet(ths->display, fontname, &missing_charset_list_return, &missing_charset_count_return,  &def_string_return);

XwcDrawString(ths->display, ths->drawable, font_set, ths->gc, x, y, &scr, 1);

我希望在此处画出剪刀标记,但会打印一些垃圾文本。

我怀疑我在API XwcDrawString中设置了错误的字体名称(虽然不确定)。 因此,任何人都可以告诉我这段代码或任何其他呈现unicode字符的方式出了什么问题。

1 个答案:

答案 0 :(得分:1)

最简单的方法可能是使用Tk的内置字体引擎,该引擎可以处理字体,后备字符,编码等所有怪异现象。

tkfont = Tk_GetFont(interp, tkwin, "Arial 14"); // Needs to be *something*

string = "\xe2\x9c\x82"; // UTF-8 encoded version of ✂

gcValues.foreground = XBlackPixel(ths->display, 0); // The colour to draw in
gcValues.font = Tk_FontId(tkfont); // Must match value passed to Tk_DrawChars
gc = Tk_GetGC(tkwin, GCForeground | GCFont, &gcValues);
Tk_DrawChars(ths->display, ths->drawable, gc, tkfont, string, strlen(string), x, y);
Tk_FreeGC(gc);

Tk_FreeFont(tkfont);