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;
}

相关文章

  • 带你从编码角度分析C++重载原理

    带你从编码角度分析C++重载原理

    这篇文章主要为大家介绍了从编码角度分析C++重载原理,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-01-01
  • C语言 MD5的源码实例详解

    C语言 MD5的源码实例详解

    这篇文章主要介绍了C语言 MD5的源码实例详解的相关资料,需要的朋友可以参考下
    2017-01-01
  • C语言实现考试报名管理系统

    C语言实现考试报名管理系统

    这篇文章主要为大家详细介绍了C语言实现考试报名管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • QT实现年会抽奖小软件的示例代码

    QT实现年会抽奖小软件的示例代码

    本文主要介绍了QT实现年会抽奖小软件的示例代码,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • 使用udp发送>=128K的消息会报ENOBUFS的错误的解决方法

    使用udp发送>=128K的消息会报ENOBUFS的错误的解决方法

    在项目中选择了unix域的数据报套接口。在使用过程中碰到了如下,问题:发送<128K的消息时,客户、进程可以正常收发消息;发送>=128K的消息时,发送端(sendto)返回ENOBUFS的错误。下面小编来详细说下
    2019-05-05
  • c语言 指针零基础讲解

    c语言 指针零基础讲解

    指针是指向另一个变量的变量。意思是一个指针保存的是另一个变量的内存地址。换句话说,指针保存的并不是普通意义上的数值,而是另一个变量的地址值。一个指针保存了另一个变量的地址值,就说这个指针“指向”了那个变量
    2022-02-02
  • C语言中顺序栈和链栈的定义和使用详解

    C语言中顺序栈和链栈的定义和使用详解

    这篇文章主要为大家详细介绍了C语言中顺序栈和链栈的定义和使用,文中的示例代码讲解详细,对我们学习C语言有一定的帮助,感兴趣的小伙伴可以了解一下
    2022-10-10
  • C++生成随机数的实现代码

    C++生成随机数的实现代码

    这篇文章主要介绍了C++生成随机数的实现代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • C++类URL编码和解码使用技巧

    C++类URL编码和解码使用技巧

    在项目开发过程中,经常会使用到c++ 的url编码和解码,本文将以此问题详细介绍使用技巧,需要的朋友可以参考下
    2012-11-11
  • c语言详解动态内存分配及常见错误的解决

    c语言详解动态内存分配及常见错误的解决

    给数组分配多大的内存空间?你是否和初学C时的我一样,有过这样的疑问。这一期就来聊一聊动态内存的分配,读完这篇文章,你可能对内存的分配有一个更好的理解
    2022-04-04

最新评论