37#define UTF8_1BYTE_CODEMAX 0x7F
38#define UTF8_2BYTE_CODEMAX 0x7FF
39#define UTF8_3BYTE_CODEMAX 0xFFFF
40#define UTF8_4BYTE_CODEMAX 0x10FFFF
42#define UTF8_1BYTE_MASK 0x80
43#define UTF8_2BYTE_MASK 0xE0
44#define UTF8_3BYTE_MASK 0xF0
45#define UTF8_4BYTE_MASK 0xF8
46#define UTF8_EXTBYTE_MASK 0xC0
48#define UTF8_1BYTE_PREFIX 0x00
49#define UTF8_2BYTE_PREFIX 0xC0
50#define UTF8_3BYTE_PREFIX 0xE0
51#define UTF8_4BYTE_PREFIX 0xF0
52#define UTF8_EXTBYTE_PREFIX 0x80
54#define UTF8_IS_1BYTE(ptr) ((ptr[0] & UTF8_1BYTE_MASK) == UTF8_1BYTE_PREFIX)
56#define UTF8_IS_2BYTE(ptr) \
57 (((ptr[0] & UTF8_2BYTE_MASK) == UTF8_2BYTE_PREFIX) && \
58 ((ptr[1] & UTF8_EXTBYTE_MASK) == UTF8_EXTBYTE_PREFIX))
60#define UTF8_IS_3BYTE(ptr) \
61 (((ptr[0] & UTF8_3BYTE_MASK) == UTF8_3BYTE_PREFIX) && \
62 (((ptr[1] | ptr[2]) & UTF8_EXTBYTE_MASK) == UTF8_EXTBYTE_PREFIX))
64#define UTF8_IS_4BYTE(ptr) \
65 (((ptr[0] & UTF8_4BYTE_MASK) == UTF8_4BYTE_PREFIX) && \
66 (((ptr[1] | ptr[2] | ptr[3]) & UTF8_EXTBYTE_MASK) == UTF8_EXTBYTE_PREFIX))
68static inline unsigned utf8CharToUnicode(
const char* ptr,
unsigned len) {
72 code = (unsigned)(ptr[0] & (
char)~UTF8_1BYTE_MASK);
74 code = (((unsigned)(ptr[0] & (
char)~UTF8_2BYTE_MASK) << 6) |
77 code = (((unsigned)(ptr[0] & (
char)~UTF8_3BYTE_MASK) << 12) |
78 ((unsigned)(ptr[1] & (
char)~UTF8_EXTBYTE_MASK) << 6) |
81 code = (((unsigned)(ptr[0] & (
char)~UTF8_4BYTE_MASK) << 18) |
82 ((unsigned)(ptr[1] & (
char)~UTF8_EXTBYTE_MASK) << 12) |
83 ((unsigned)(ptr[2] & (
char)~UTF8_EXTBYTE_MASK) << 6) |
90static inline unsigned utf8CodeWidth(
unsigned code) {
103static inline void unicodeToUtf8Char(
unsigned code,
unsigned char* ptr,
unsigned len) {
104 unsigned codeWidth = utf8CodeWidth(code);
106 if ((codeWidth == 1) && (len >= codeWidth)) {
108 }
else if ((codeWidth == 2) && (len >= codeWidth)) {
111 }
else if ((codeWidth == 3) && (len >= codeWidth)) {
115 }
else if ((codeWidth == 4) && (len >= codeWidth)) {
127 static int state_table[32] = {
128 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
129 1, 1, 1, 1, 1, 1, 1, 1,
136 static int mask_bytes[32] = {0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F,
137 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
138 0x00, 0x00, 0x1F, 0x1F, 0x1F, 0x1F, 0x0F, 0x0F, 0x07, 0x00};
140 static int next[5] = {0, 1, 0, 2, 3};
143 *codep =
byte & mask_bytes[
byte >> 3];
144 *state = state_table[
byte >> 3];
145 }
else if (*state > 0) {
146 *codep = (
byte & 0x3F) | (*codep << 6);
147 *state = next[*state];
unsigned int uint32_t
Definition acefiex.h:163
#define UTF8_IS_4BYTE(ptr)
Definition utf.h:64
#define UTF8_3BYTE_PREFIX
Definition utf.h:50
#define UTF8_2BYTE_PREFIX
Definition utf.h:49
#define UTF8_EXTBYTE_MASK
Definition utf.h:46
#define UTF8_4BYTE_PREFIX
Definition utf.h:51
#define UTF8_3BYTE_CODEMAX
Definition utf.h:39
#define UTF8_IS_2BYTE(ptr)
Definition utf.h:56
#define UTF8_1BYTE_CODEMAX
Definition utf.h:37
#define UTF8_ACCEPT
Definition utf.h:123
#define UTF8_IS_3BYTE(ptr)
Definition utf.h:60
#define UTF8_IS_1BYTE(ptr)
Definition utf.h:54
#define UTF8_4BYTE_CODEMAX
Definition utf.h:40
#define UTF8_EXTBYTE_PREFIX
Definition utf.h:52
#define UTF8_2BYTE_CODEMAX
Definition utf.h:38