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

如何使用X11系统在TCL/TK中呈现Unicode字符,tcl,x11,tk,xlib,Tcl,X11,Tk,Xlib,我正在尝试渲染一个unicode字符以绘制一个剪刀标记(✂) 在TCL/TK中 我正在使用X11 API“void XwcDrawString(Display*Display,drawsable d,XFontSet font\u set,GC GC,int x,int y,wchar\u t*string,int num\u wchars)” 我希望在这里画上剪痕,但会打印一些垃圾文本 我怀疑我在API XwcDrawString中设置了错误的字体名称(但不确定)。 因此,任何人都可以告诉我这

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

我正在使用X11 API“void XwcDrawString(Display*Display,drawsable d,XFontSet font\u set,GC GC,int x,int y,wchar\u t*string,int num\u wchars)”

我希望在这里画上剪痕,但会打印一些垃圾文本

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

最简单的方法可能是使用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);

您不能在任何使用
ISO8859-1
作为编码的字体中打印该字符;它根本不存在于该编码中!请注意,字体名称不是XLFD,而只是
Arial 14
,一种字体系列名称和大小;使用用户脚本的经验表明,99.99%的代码更喜欢使用更简单的形式。Hi D当然,上面的代码会打印一个unicode剪切标记。但不幸的是,由于某些情况,我们需要在我们的项目中使用X11 API或方法来呈现unicode。您是否可以建议使用X11。
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);