6 static char utf8buf
[16];
8 int writeUTF8(unsigned int charnum
, char*dest
)
15 } else if(charnum
<0x800) {
16 /* 0000 0080-0000 07FF 110xxxxx 10xxxxxx */
17 dest
[0] = 0xc0 | (charnum
>> 6);
18 dest
[1] = 0x80 | (charnum
& 0x3f);
21 } else if(charnum
< 0x10000) {
22 /* 0000 0800-0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx */
23 dest
[0] = 0xe0 | (charnum
>> 12);
24 dest
[1] = 0x80 |((charnum
>> 6)&0x3f);
25 dest
[2] = 0x80 |((charnum
)&0x3f);
28 } else if(charnum
< 0x200000) {
29 /* 0001 0000-001F FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx */
30 dest
[0] = 0xf0 | (charnum
>> 18);
31 dest
[1] = 0x80 |((charnum
>> 12)&0x3f);
32 dest
[2] = 0x80 |((charnum
>> 6 )&0x3f);
33 dest
[3] = 0x80 |((charnum
)&0x3f);
36 } else if(charnum
< 0x4000000) {
37 /* 0020 0000-03FF FFFF 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx */
38 dest
[0] = 0xf8 | (charnum
>> 24);
39 dest
[1] = 0x80 |((charnum
>> 18)&0x3f);
40 dest
[2] = 0x80 |((charnum
>> 12)&0x3f);
41 dest
[3] = 0x80 |((charnum
>> 6 )&0x3f);
42 dest
[4] = 0x80 |((charnum
)&0x3f);
45 } else if(charnum
< 0x80000000) {
46 /* 0400 0000-7FFF FFFF 1111110x 10xxxxxx ... 10xxxxxx */
47 dest
[0] = 0xfc | (charnum
>> 30);
48 dest
[1] = 0x80 |((charnum
>> 24)&0x3f);
49 dest
[2] = 0x80 |((charnum
>> 18)&0x3f);
50 dest
[3] = 0x80 |((charnum
>> 12)&0x3f);
51 dest
[4] = 0x80 |((charnum
>> 6 )&0x3f);
52 dest
[5] = 0x80 |((charnum
)&0x3f);
56 fprintf(stderr
, "Illegal character: 0x%08x\n", charnum
);
62 char* getUTF8(unsigned int charnum
)
64 memset(utf8buf
, 0, sizeof(utf8buf
));
65 writeUTF8(charnum
, utf8buf
);