C++中可正确获取UTF-8字符长度的函数分享
更新时间:2014年08月05日 09:55:20 投稿:junjie
这篇文章主要介绍了C++中可正确获取UTF-8字符长度的函数分享,需要的朋友可以参考下
在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; // 1000000
const unsigned char kSecondBitMask = 64; // 0100000
const unsigned char kThirdBitMask = 32; // 0010000
const unsigned char kFourthBitMask = 16; // 0001000
const 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;
}
相关文章
Windows系统vscode安装与配置G++、Cmake的图文步骤
本文主要介绍了Windows系统vscode安装与配置G++、Cmake的步骤,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2025-04-04
C++ 中"priority_queue" 优先级队列实例详解
这篇文章主要介绍了C++ 中"priority_queue" 优先级队列实例详解的相关资料,需要的朋友可以参考下2017-04-04


最新评论