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

问题描述 投票:0回答:1

我试图渲染一个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字符。

tcl x11 tk xlib
1个回答
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);
© www.soinside.com 2019 - 2024. All rights reserved.