欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++中可正確獲取UTF-8字符長度的函數(shù)分享

 更新時(shí)間:2014年08月05日 09:55:20   投稿:junjie  
這篇文章主要介紹了C++中可正確獲取UTF-8字符長度的函數(shù)分享,需要的朋友可以參考下

在C++的char*以及string中,使用的是字節(jié)流編碼,即sizeof(char) == 1。

也就是說,C++是不區(qū)分字符的編碼的。

而一個(gè)合法UTF8的字符長度可能為1~4位。

現(xiàn)在假設(shè)一串輸入為UTF8編碼,如何能準(zhǔn)確的定位到每個(gè)UTF8字符的“CharPoint”,而不會(huì)錯(cuò)誤的分割字符呢?

參考這個(gè)頁面:http://www.nubaria.com/en/blog/?p=289

可以改造出下面的函數(shù):

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

相關(guān)文章

  • 帶你從編碼角度分析C++重載原理

    帶你從編碼角度分析C++重載原理

    這篇文章主要為大家介紹了從編碼角度分析C++重載原理,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • C語言 MD5的源碼實(shí)例詳解

    C語言 MD5的源碼實(shí)例詳解

    這篇文章主要介紹了C語言 MD5的源碼實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-01-01
  • C語言實(shí)現(xiàn)考試報(bào)名管理系統(tǒng)

    C語言實(shí)現(xiàn)考試報(bào)名管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)考試報(bào)名管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • QT實(shí)現(xiàn)年會(huì)抽獎(jiǎng)小軟件的示例代碼

    QT實(shí)現(xiàn)年會(huì)抽獎(jiǎng)小軟件的示例代碼

    本文主要介紹了QT實(shí)現(xiàn)年會(huì)抽獎(jiǎng)小軟件的示例代碼,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • 使用udp發(fā)送>=128K的消息會(huì)報(bào)ENOBUFS的錯(cuò)誤的解決方法

    使用udp發(fā)送>=128K的消息會(huì)報(bào)ENOBUFS的錯(cuò)誤的解決方法

    在項(xiàng)目中選擇了unix域的數(shù)據(jù)報(bào)套接口。在使用過程中碰到了如下,問題:發(fā)送<128K的消息時(shí),客戶、進(jìn)程可以正常收發(fā)消息;發(fā)送>=128K的消息時(shí),發(fā)送端(sendto)返回ENOBUFS的錯(cuò)誤。下面小編來詳細(xì)說下
    2019-05-05
  • c語言?指針零基礎(chǔ)講解

    c語言?指針零基礎(chǔ)講解

    指針是指向另一個(gè)變量的變量。意思是一個(gè)指針保存的是另一個(gè)變量的內(nèi)存地址。換句話說,指針保存的并不是普通意義上的數(shù)值,而是另一個(gè)變量的地址值。一個(gè)指針保存了另一個(gè)變量的地址值,就說這個(gè)指針“指向”了那個(gè)變量
    2022-02-02
  • C語言中順序棧和鏈棧的定義和使用詳解

    C語言中順序棧和鏈棧的定義和使用詳解

    這篇文章主要為大家詳細(xì)介紹了C語言中順序棧和鏈棧的定義和使用,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C語言有一定的幫助,感興趣的小伙伴可以了解一下
    2022-10-10
  • C++生成隨機(jī)數(shù)的實(shí)現(xiàn)代碼

    C++生成隨機(jī)數(shù)的實(shí)現(xiàn)代碼

    這篇文章主要介紹了C++生成隨機(jī)數(shù)的實(shí)現(xiàn)代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • C++類URL編碼和解碼使用技巧

    C++類URL編碼和解碼使用技巧

    在項(xiàng)目開發(fā)過程中,經(jīng)常會(huì)使用到c++ 的url編碼和解碼,本文將以此問題詳細(xì)介紹使用技巧,需要的朋友可以參考下
    2012-11-11
  • c語言詳解動(dòng)態(tài)內(nèi)存分配及常見錯(cuò)誤的解決

    c語言詳解動(dòng)態(tài)內(nèi)存分配及常見錯(cuò)誤的解決

    給數(shù)組分配多大的內(nèi)存空間?你是否和初學(xué)C時(shí)的我一樣,有過這樣的疑問。這一期就來聊一聊動(dòng)態(tài)內(nèi)存的分配,讀完這篇文章,你可能對(duì)內(nèi)存的分配有一個(gè)更好的理解
    2022-04-04

最新評(píng)論