C++中可正确获取UTF-8字符长度的函数分享

时间:2021-05-20

在C++的char*以及string中,使用的是字节流编码,即sizeof(char) == 1。

也就是说,C++是不区分字符的编码的。

而一个合法UTF8的字符长度可能为1~4位。

现在假设一串输入为UTF8编码,如何能准确的定位到每个UTF8字符的“CharPoint”,而不会错误的分割字符呢?

参考这个页面:http:///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;}

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章