21#if !defined(WIN32) && !defined(__APPLE__)
33XConvertUtf8ToUcs(
const unsigned char *buf,
49 && (buf[1] & 0xC0) == 0x80
50 && (buf[2] & 0xC0) == 0x80
51 && (buf[3] & 0xC0) == 0x80
52 && (buf[4] & 0xC0) == 0x80) {
54 *ucs = ((buf[0] & ~0xF8) << 24) +
55 ((buf[1] & ~0x80) << 18) +
56 ((buf[2] & ~0x80) << 12) +
57 ((buf[3] & ~0x80) << 6) +
59 if (*ucs > 0x001FFFFF && *ucs < 0x01000000)
return 5;
62 && (buf[1] & 0xC0) == 0x80
63 && (buf[2] & 0xC0) == 0x80
64 && (buf[3] & 0xC0) == 0x80) {
66 *ucs = ((buf[0] & ~0xF0) << 18) +
67 ((buf[1] & ~0x80) << 12) +
68 ((buf[2] & ~0x80) << 6) +
70 if (*ucs > 0x0000FFFF)
return 4;
73 && (buf[1] & 0xC0) == 0x80
74 && (buf[2] & 0xC0) == 0x80) {
76 *ucs = ((buf[0] & ~0xE0) << 12) +
77 ((buf[1] & ~0x80) << 6) +
79 if (*ucs > 0x000007FF)
return 3;
81 }
else if (len > 1 && (buf[1] & 0xC0) == 0x80) {
83 *ucs = ((buf[0] & ~0xC0) << 6) +
85 if (*ucs > 0x0000007F)
return 2;
94 *ucs = (
unsigned int)
'?';
103XConvertUcsToUtf8(
unsigned int ucs,
106 if (ucs < 0x000080) {
109 }
else if (ucs < 0x000800) {
110 buf[0] = 0xC0 | (ucs >> 6);
111 buf[1] = 0x80 | (ucs & 0x3F);
113 }
else if (ucs < 0x010000) {
114 buf[0] = 0xE0 | (ucs >> 12);
115 buf[1] = 0x80 | ((ucs >> 6) & 0x3F);
116 buf[2] = 0x80 | (ucs & 0x3F);
118 }
else if (ucs < 0x00200000) {
119 buf[0] = 0xF0 | (ucs >> 18);
120 buf[1] = 0x80 | ((ucs >> 12) & 0x3F);
121 buf[2] = 0x80 | ((ucs >> 6) & 0x3F);
122 buf[3] = 0x80 | (ucs & 0x3F);
124 }
else if (ucs < 0x01000000) {
125 buf[0] = 0xF8 | (ucs >> 24);
126 buf[1] = 0x80 | ((ucs >> 18) & 0x3F);
127 buf[2] = 0x80 | ((ucs >> 12) & 0x3F);
128 buf[3] = 0x80 | ((ucs >> 6) & 0x3F);
129 buf[4] = 0x80 | (ucs & 0x3F);
141XUtf8CharByteLen(
const unsigned char *buf,
144 return XConvertUtf8ToUcs(buf, len, &ucs);
151XCountUtf8Char(
const unsigned char *buf,
157 int cl = XUtf8CharByteLen(buf + i, len - i);
169XFastConvertUtf8ToUcs(
const unsigned char *buf,
184 }
else if (len > 4) {
186 *ucs = ((buf[0] & ~0xF8) << 24) +
187 ((buf[1] & ~0x80) << 18) +
188 ((buf[2] & ~0x80) << 12) +
189 ((buf[3] & ~0x80) << 6) +
193 }
else if (len > 3) {
195 *ucs = ((buf[0] & ~0xF0) << 18) +
196 ((buf[1] & ~0x80) << 12) +
197 ((buf[2] & ~0x80) << 6) +
201 }
else if (len > 2) {
203 *ucs = ((buf[0] & ~0xE0) << 12) +
204 ((buf[1] & ~0x80) << 6) +
208 }
else if (len > 1) {
210 *ucs = ((buf[0] & ~0xC0) << 6) +
215 }
else if (len > 0) {
221 *ucs = (
unsigned int)
'?';