Hàm convertUTF16toUTF8 bên dưới sẽ thực hiện convert chuỗi ký tự mã hóa hóa bằng UTF16, được lưu trong một vùng nhớ (hay buffer) được trỏ bởi utf16Buf thành chuỗi ký tự mã hóa bằng UTF8, trả về dưới dạng str::string →
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
std::string convertUTF16toUTF8(const uint16_t* utf16Buf) { std::string utf8Str = ""; uint16_t utf16CodePoint = 0; // convert (refer to https://en.wikipedia.org/wiki/UTF-8) for (utf16Buf; *utf16Buf != 0; ++utf16Buf) { utf16CodePoint = *utf16Buf; // 7 bits codepoint if (utf16CodePoint <= 0x007f) { // using 1 byte: 0xxxxxxx utf8Str.append(1, static_cast<char>(utf16CodePoint)); } // 11 bits codepoint else if (utf16CodePoint <= 0x07ff) { // using 2 bytes: 110xxxxx 10xxxxxx char byte1 = 0xc0 | ((utf16CodePoint >> 6) & 0x1f); char byte2 = 0x80 | (utf16CodePoint & 0x3f); utf8Str.append(1, byte1); utf8Str.append(1, byte2); } // 16 bits codepoint else { // using 3 bytes: 1110xxxx 10xxxxxx 10xxxxxx char byte1 = 0xe0 | ((utf16CodePoint >> 12) & 0x0f); char byte2 = 0x80 | ((utf16CodePoint >> 6) & 0x3f); char byte3 = 0x80 | (utf16CodePoint & 0x3f); utf8Str.append(1, byte1); utf8Str.append(1, byte2); utf8Str.append(1, byte3); } } return utf8Str; } |
— Phạm Minh Tuấn (Shun) —
