Как отобразить символ Unicode в TCL / TK с использованием системы X11 - PullRequest
0 голосов
/ 01 мая 2019

Я пытаюсь отобразить символ Юникода, чтобы нарисовать знак ножниц (✂) в 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) "* ​​1003 *

/* 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 (хотя не уверен).Итак, кто-нибудь может сказать мне, что не так с этим кодом или любым другим способом визуализации символа Юникода.

1 Ответ

1 голос
/ 01 мая 2019

Самый простой способ, вероятно, заключается в использовании встроенного в 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);
...