utf-8 字串轉 unicode 字串
阿新 • • 發佈:2019-01-24
utf-8編碼簡介
utf-8編碼是一種變長編碼, 中文字元用三個byte來儲存,而編碼範圍在 0 到 0x7f 則使用1個位元組儲存
Number of bytes | Bits for code point | First code point | Last code point | Byte1 | Byte2 | Byte3 | Byte4 |
---|---|---|---|---|---|---|---|
1 | 7 | U+0000 | U+007F | 0xxxxxxx | |||
2 | 11 | U+0080 | U+07FF | 110xxxxx | 10xxxxxx | ||
3 | 16 | U+0800 | U+FFFF | 1110xxxx | 10xxxxxx | 10xxxxxx | |
4 | 21 | U+10000 | U+10FFFF | 11110xxx | 10xxxxxx | 10xxxxxx | 10xxxxxx |
以下是編碼例子,這些都是來自於維基百科
以下程式碼能把 utf-8 多位元組字串,轉換成為unicode 字串,如轉載請註明出處
static int z_pos(uint8_t x)
{
for (int i = 0; i < 5; i++, x <<= 1) {
if ( (x & 0x80) == 0 )
return i;
}
return 4;
}
// convert UTF-8 string to wstring
std::wstring utf8_to_wstring(const std::string& str)
{
std::wstring loc;
uint8_t mask[5] = { 0x7f, 0x3f, 0x1f, 0x0f, 0x7};
for (size_t i = 0; i < str.length();) {
int byte_cnt = z_pos(str[i]);
uint16_t sum = str[i] & mask[byte_cnt];
for (size_t j = 1; j < byte_cnt; j++) {
sum <<= 6;
sum |= str[i+j] & mask[1];
}
i += byte_cnt ? byte_cnt : 1;
loc.push_back(sum);
}
return loc;
}