utf8.c (1592B)
1 #include "termbox.h" 2 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 12 }; 13 14 static const unsigned char utf8_mask[6] = { 15 0x7F, 16 0x1F, 17 0x0F, 18 0x07, 19 0x03, 20 0x01 21 }; 22 23 int utf8_char_length(char c) 24 { 25 return utf8_length[(unsigned char)c]; 26 } 27 28 int utf8_char_to_unicode(uint32_t *out, const char *c) 29 { 30 if (*c == 0) 31 return TB_EOF; 32 33 int i; 34 unsigned char len = 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) { 38 result <<= 6; 39 result |= c[i] & 0x3f; 40 } 41 42 *out = result; 43 return (int)len; 44 } 45 46 int utf8_unicode_to_char(char *out, uint32_t c) 47 { 48 int len = 0; 49 int first; 50 int i; 51 52 if (c < 0x80) { 53 first = 0; 54 len = 1; 55 } else if (c < 0x800) { 56 first = 0xc0; 57 len = 2; 58 } else if (c < 0x10000) { 59 first = 0xe0; 60 len = 3; 61 } else if (c < 0x200000) { 62 first = 0xf0; 63 len = 4; 64 } else if (c < 0x4000000) { 65 first = 0xf8; 66 len = 5; 67 } else { 68 first = 0xfc; 69 len = 6; 70 } 71 72 for (i = len - 1; i > 0; --i) { 73 out[i] = (c & 0x3f) | 0x80; 74 c >>= 6; 75 } 76 out[0] = c | first; 77 78 return len; 79 }