22 #define UNI_MAX_LEGAL_UTF32 0x0010FFFF
32 for (len = 0; utf8_str[len] != 0 && len <
UNICHAR_LEN; ++len);
34 for (total_len = 0; total_len < len; total_len += step) {
41 for (i = 1; i < step; ++i)
42 if ((utf8_str[total_len + i] & 0xc0) != 0x80)
47 memcpy(chars, utf8_str, total_len);
51 chars[total_len++] = 0;
58 const int bytemask = 0xBF;
59 const int bytemark = 0x80;
65 chars[0] =
static_cast<char>(unicode);
66 }
else if (unicode < 0x800) {
69 chars[1] =
static_cast<char>((unicode | bytemark) & bytemask);
71 chars[0] =
static_cast<char>(unicode | 0xc0);
72 }
else if (unicode < 0x10000) {
74 chars[2] =
static_cast<char>((unicode | bytemark) & bytemask);
76 chars[1] =
static_cast<char>((unicode | bytemark) & bytemask);
78 chars[0] =
static_cast<char>(unicode | 0xe0);
81 chars[3] =
static_cast<char>((unicode | bytemark) & bytemask);
83 chars[2] =
static_cast<char>((unicode | bytemark) & bytemask);
85 chars[1] =
static_cast<char>((unicode | bytemark) & bytemask);
87 chars[0] =
static_cast<char>(unicode | 0xf0);
95 static const int utf8_offsets[5] = {
96 0, 0, 0x3080, 0xE2080, 0x3C82080
100 const char* src = chars;
106 uni +=
static_cast<unsigned char>(*src++);
109 uni +=
static_cast<unsigned char>(*src++);
112 uni +=
static_cast<unsigned char>(*src++);
115 uni +=
static_cast<unsigned char>(*src++);
117 uni -= utf8_offsets[len];
124 char* str =
new char[len + 1];
125 memcpy(str, chars, len);
132 static const char utf8_bytes[256] = {
133 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
134 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
135 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
136 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
137 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
138 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
139 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
140 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, 4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0
143 return utf8_bytes[
static_cast<unsigned char>(*utf8_str)];