30#if !defined(WIN32) && !defined(__APPLE__)
32#include "../../FL/Xutf8.h"
42XConvertUtf8ToUcs(
const unsigned char *buf,
58 && (buf[1] & 0xC0) == 0x80
59 && (buf[2] & 0xC0) == 0x80
60 && (buf[3] & 0xC0) == 0x80
61 && (buf[4] & 0xC0) == 0x80) {
63 *ucs = ((buf[0] & ~0xF8) << 24) +
64 ((buf[1] & ~0x80) << 18) +
65 ((buf[2] & ~0x80) << 12) +
66 ((buf[3] & ~0x80) << 6) +
68 if (*ucs > 0x001FFFFF && *ucs < 0x01000000)
return 5;
71 && (buf[1] & 0xC0) == 0x80
72 && (buf[2] & 0xC0) == 0x80
73 && (buf[3] & 0xC0) == 0x80) {
75 *ucs = ((buf[0] & ~0xF0) << 18) +
76 ((buf[1] & ~0x80) << 12) +
77 ((buf[2] & ~0x80) << 6) +
79 if (*ucs > 0x0000FFFF)
return 4;
82 && (buf[1] & 0xC0) == 0x80
83 && (buf[2] & 0xC0) == 0x80) {
85 *ucs = ((buf[0] & ~0xE0) << 12) +
86 ((buf[1] & ~0x80) << 6) +
88 if (*ucs > 0x000007FF)
return 3;
90 }
else if (len > 1 && (buf[1] & 0xC0) == 0x80) {
92 *ucs = ((buf[0] & ~0xC0) << 6) +
94 if (*ucs > 0x0000007F)
return 2;
103 *ucs = (
unsigned int)
'?';
112XConvertUcsToUtf8(
unsigned int ucs,
115 if (ucs < 0x000080) {
118 }
else if (ucs < 0x000800) {
119 buf[0] = 0xC0 | (ucs >> 6);
120 buf[1] = 0x80 | (ucs & 0x3F);
122 }
else if (ucs < 0x010000) {
123 buf[0] = 0xE0 | (ucs >> 12);
124 buf[1] = 0x80 | ((ucs >> 6) & 0x3F);
125 buf[2] = 0x80 | (ucs & 0x3F);
127 }
else if (ucs < 0x00200000) {
128 buf[0] = 0xF0 | (ucs >> 18);
129 buf[1] = 0x80 | ((ucs >> 12) & 0x3F);
130 buf[2] = 0x80 | ((ucs >> 6) & 0x3F);
131 buf[3] = 0x80 | (ucs & 0x3F);
133 }
else if (ucs < 0x01000000) {
134 buf[0] = 0xF8 | (ucs >> 24);
135 buf[1] = 0x80 | ((ucs >> 18) & 0x3F);
136 buf[2] = 0x80 | ((ucs >> 12) & 0x3F);
137 buf[3] = 0x80 | ((ucs >> 6) & 0x3F);
138 buf[4] = 0x80 | (ucs & 0x3F);
150XUtf8CharByteLen(
const unsigned char *buf,
153 return XConvertUtf8ToUcs(buf, len, &ucs);
160XCountUtf8Char(
const unsigned char *buf,
166 int cl = XUtf8CharByteLen(buf + i, len - i);
178XFastConvertUtf8ToUcs(
const unsigned char *buf,
193 }
else if (len > 4) {
195 *ucs = ((buf[0] & ~0xF8) << 24) +
196 ((buf[1] & ~0x80) << 18) +
197 ((buf[2] & ~0x80) << 12) +
198 ((buf[3] & ~0x80) << 6) +
202 }
else if (len > 3) {
204 *ucs = ((buf[0] & ~0xF0) << 18) +
205 ((buf[1] & ~0x80) << 12) +
206 ((buf[2] & ~0x80) << 6) +
210 }
else if (len > 2) {
212 *ucs = ((buf[0] & ~0xE0) << 12) +
213 ((buf[1] & ~0x80) << 6) +
217 }
else if (len > 1) {
219 *ucs = ((buf[0] & ~0xC0) << 6) +
224 }
else if (len > 0) {
230 *ucs = (
unsigned int)
'?';