在C++的char*以及string中,使用的是字節流編碼,即sizeof(char) == 1。
也就是說,C++是不區分字符的編碼的。
而一個合法UTF8的字符長度可能為1~4位。
現在假設一串輸入為UTF8編碼,如何能準確的定位到每個UTF8字符的“CharPoint”,而不會錯誤的分割字符呢?
參考這個頁面:http://www.nubaria.com/en/blog/?p=289
可以改造出下面的函數:
const unsigned char kFirstBitMask = 128; // 1000000const unsigned char kSecondBitMask = 64; // 0100000const unsigned char kThirdBitMask = 32; // 0010000const unsigned char kFourthBitMask = 16; // 0001000const unsigned char kFifthBitMask = 8; // 0000100 int utf8_char_len(char firstByte){ std::string::difference_type offset = 1; if(firstByte & kFirstBitMask) // This means the first byte has a value greater than 127, and so is beyond the ASCII range. { if(firstByte & kThirdBitMask) // This means that the first byte has a value greater than 224, and so it must be at least a three-octet code point. { if(firstByte & kFourthBitMask) // This means that the first byte has a value greater than 240, and so it must be a four-octet code point. offset = 4; else offset = 3; } else { offset = 2; } } return offset;}
新聞熱點
疑難解答