3 static const unsigned char utf8_length
[256] = {
4 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,
5 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,
6 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,
7 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,
8 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,
9 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,
10 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,
11 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,6,6,1,1
14 static const unsigned char utf8_mask
[6] = {
23 int tb_utf8_char_length(char c
)
25 return utf8_length
[(unsigned char)c
];
28 int tb_utf8_char_to_unicode(uint32_t *out
, const char *c
)
34 unsigned char len
= tb_utf8_char_length(*c
);
35 unsigned char mask
= utf8_mask
[len
-1];
36 uint32_t result
= c
[0] & mask
;
37 for (i
= 1; i
< len
; ++i
) {
39 result
|= c
[i
] & 0x3f;
46 int tb_utf8_unicode_to_char(char *out
, uint32_t c
)
55 } else if (c
< 0x800) {
58 } else if (c
< 0x10000) {
61 } else if (c
< 0x200000) {
64 } else if (c
< 0x4000000) {
72 for (i
= len
- 1; i
> 0; --i
) {
73 out
[i
] = (c
& 0x3f) | 0x80;