我正在尝试渲染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字符的方式出了什么问题。
答案 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);