История изменений
Исправление Zubok, (текущая версия) :
Там можно произвольную строчку указывать, если что. Параметры -sample, -sample16 и -sampleUCS.
Вот, собственно, процедура:
static void _XawLabelDrawUCS(Display *dpy, Drawable d, GC gc,
int x, int y, char *str, int n)
{
char *ep;
unsigned short codepoint;
XChar2b *ptr;
/*
* Convert to UCS2 string on the fly.
*/
if (n > buf2blen) {
buf2b = (XChar2b *)XtRealloc((char *)buf2b, n * sizeof(XChar2b));
buf2blen = n;
}
ep = str + n;
for (ptr = buf2b; str < ep; ptr++) {
if((str[0]&0x80)==0) {
codepoint=str[0];
str++;
} else if((str[0]&0x20)==0) {
codepoint=(str[0]&0x1F)<<6 | (str[1]&0x3F);
str+=2;
} else if((str[0]&0x10)==0) {
codepoint=(str[0]&0x0F)<<12 | (str[1]&0x3F)<<6 | (str[2]&0x3F);
str+=3;
} else { /* wrong UTF-8 */
codepoint=(unsigned)'?';
str++;
}
ptr->byte1 = (codepoint >> 8) & 0xff;;
ptr->byte2 = codepoint & 0xff;
}
XDrawString16(dpy, d, gc, x, y, buf2b, ptr - buf2b);
}
Исходная версия Zubok, :
Там можно произвольную строчку указывать, если что. Параметры -sample, -sample16 и -sampleUCS.
Вот, собственно, процедура:
static void _XawLabelDrawUCS(Display *dpy, Drawable d, GC gc,
int x, int y, char *str, int n)
{
char *ep;
unsigned short codepoint;
XChar2b *ptr;
/*
* Convert to UCS2 string on the fly.
*/
if (n > buf2blen) {
buf2b = (XChar2b *)XtRealloc((char *)buf2b, n * sizeof(XChar2b));
buf2blen = n;
}
ep = str + n;
for (ptr = buf2b; str < ep; ptr++) {
if((str[0]&0x80)==0) {
codepoint=str[0];
str++;
} else if((str[0]&0x20)==0) {
codepoint=(str[0]&0x1F)<<6 | (str[1]&0x3F);
str+=2;
} else if((str[0]&0x10)==0) {
codepoint=(str[0]&0x0F)<<12 | (str[1]&0x3F)<<6 | (str[2]&0x3F);
str+=3;
} else { /* wrong UTF-8 */
codepoint=(unsigned)'?';
str++;
}
ptr->byte1 = (codepoint >> 8) & 0xff;;
ptr->byte2 = codepoint & 0xff;
}
XDrawString16(dpy, d, gc, x, y, buf2b, ptr - buf2b);
}