最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++實(shí)現(xiàn)判斷一個字符串是否為UTF8或GBK格式的方法

 更新時間:2017年11月20日 10:22:55   作者:黑夜童話  
這篇文章主要介紹了C++實(shí)現(xiàn)判斷一個字符串是否為UTF8或GBK格式的方法,涉及C++針對字符編碼的遍歷、判斷、編碼轉(zhuǎn)換等相關(guān)操作技巧,需要的朋友可以參考下

本文實(shí)例講述了C++實(shí)現(xiàn)判斷一個字符串是否為UTF8或GBK格式的方法。分享給大家供大家參考,具體如下:

在處理外部數(shù)據(jù)的時候,很可能因為數(shù)據(jù)格式不一樣而導(dǎo)致亂碼,甚至導(dǎo)致某些程序掛掉。鑒于對多數(shù)系統(tǒng)來說,使用是更被廣泛使用的utf8,所以判斷是不是utf8格式顯得很重要了。

下面是一個判斷字符串是否為utf8的函數(shù):

bool is_str_utf8(const char* str)
{
  unsigned int nBytes = 0;//UFT8可用1-6個字節(jié)編碼,ASCII用一個字節(jié)
  unsigned char chr = *str;
  bool bAllAscii = true;
  for (unsigned int i = 0; str[i] != '\0'; ++i){
    chr = *(str + i);
    //判斷是否ASCII編碼,如果不是,說明有可能是UTF8,ASCII用7位編碼,最高位標(biāo)記為0,0xxxxxxx
    if (nBytes == 0 && (chr & 0x80) != 0){
      bAllAscii = false;
    }
    if (nBytes == 0) {
      //如果不是ASCII碼,應(yīng)該是多字節(jié)符,計算字節(jié)數(shù)
      if (chr >= 0x80) {
        if (chr >= 0xFC && chr <= 0xFD){
          nBytes = 6;
        }
        else if (chr >= 0xF8){
          nBytes = 5;
        }
        else if (chr >= 0xF0){
          nBytes = 4;
        }
        else if (chr >= 0xE0){
          nBytes = 3;
        }
        else if (chr >= 0xC0){
          nBytes = 2;
        }
        else{
          return false;
        }
        nBytes--;
      }
    }
    else{
      //多字節(jié)符的非首字節(jié),應(yīng)為 10xxxxxx
      if ((chr & 0xC0) != 0x80){
        return false;
      }
      //減到為零為止
      nBytes--;
    }
  }
  //違返UTF8編碼規(guī)則
  if (nBytes != 0) {
    return false;
  }
  if (bAllAscii){ //如果全部都是ASCII, 也是UTF8
    return true;
  }
  return true;
}

關(guān)于utf8的一般性簡介和二進(jìn)制格式可以參考百度百科。同樣關(guān)于GBK的判斷,也是使用的同樣的方法,具體代碼如下:

bool is_str_gbk(const char* str)
{
  unsigned int nBytes = 0;//GBK可用1-2個字節(jié)編碼,中文兩個 ,英文一個
  unsigned char chr = *str;
  bool bAllAscii = true; //如果全部都是ASCII,
  for (unsigned int i = 0; str[i] != '\0'; ++i){
    chr = *(str + i);
    if ((chr & 0x80) != 0 && nBytes == 0){// 判斷是否ASCII編碼,如果不是,說明有可能是GBK
      bAllAscii = false;
    }
    if (nBytes == 0) {
      if (chr >= 0x80) {
        if (chr >= 0x81 && chr <= 0xFE){
          nBytes = +2;
        }
        else{
          return false;
        }
        nBytes--;
      }
    }
    else{
      if (chr < 0x40 || chr>0xFE){
        return false;
      }
      nBytes--;
    }//else end
  }
  if (nBytes != 0) {   //違返規(guī)則
    return false;
  }
  if (bAllAscii){ //如果全部都是ASCII, 也是GBK
    return true;
  }
  return true;
}

按照編碼規(guī)則這么寫,是正確的。但鑒于現(xiàn)在的utf8對于中文一般都是三個字節(jié),而且utf8的編碼規(guī)則存在重合,如果是utf8,使用上面的這個函數(shù),就會出現(xiàn)一個尷尬的問題,當(dāng)中文字符為奇數(shù)個判斷正確,為則偶數(shù)個無法區(qū)別。

最后:如果誰有更好的辦法判斷一個字符串是否為GBK格式,歡迎告知。

希望本文所述對大家C++程序設(shè)計有所幫助。

相關(guān)文章

  • 詳解C語言中的預(yù)處理命令

    詳解C語言中的預(yù)處理命令

    初學(xué)C語言的時候,我們會在開頭寫下一句話,#include<stdio.h>,這就是預(yù)處理命令,下面我們通過這篇文章來了解一下,感興趣的可以跟隨小編一起學(xué)習(xí)一下
    2022-12-12
  • C語言中`||`的短路機(jī)制詳解

    C語言中`||`的短路機(jī)制詳解

    在C語言中,邏輯或運(yùn)算符(||)是一種常用的邏輯運(yùn)算符,用于組合多個條件表達(dá)式,C語言中的邏輯或運(yùn)算符具有短路機(jī)制,這是一種非常重要的概念,本文將深入解釋C語言中的||短路機(jī)制以及其在編程中的應(yīng)用,感興趣的朋友跟隨小編一起看看吧
    2024-01-01
  • Matlab實(shí)現(xiàn)獲取文件夾下所有指定后綴的文件

    Matlab實(shí)現(xiàn)獲取文件夾下所有指定后綴的文件

    這篇文章主要為大家詳細(xì)介紹了Matlab如何獲取文件夾下所有指定后綴的文件(包含子文件夾),文中的示例代碼講解詳細(xì),感興趣的可以嘗試一下
    2022-11-11
  • Visual Studio Code 從簡介、安裝到配置所需插件詳細(xì)介紹

    Visual Studio Code 從簡介、安裝到配置所需插件詳細(xì)介紹

    這篇文章給大家介紹到vs與vs code的區(qū)別,并且會詳細(xì)介紹vscode的安裝步驟,和我所了解過的插件配置,感興趣的朋友跟隨小編一起看看吧
    2020-03-03
  • C語言簡易實(shí)現(xiàn)掃雷小游戲

    C語言簡易實(shí)現(xiàn)掃雷小游戲

    這篇文章主要為大家詳細(xì)介紹了C語言簡易實(shí)現(xiàn)掃雷小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • C++?正則表達(dá)式的應(yīng)用詳解

    C++?正則表達(dá)式的應(yīng)用詳解

    正則表達(dá)式(regular?expression)描述了一種字符串匹配的模式(pattern),可以用來檢查一個串是否含有某種子串、將匹配的子串替換或者從某個串中取出符合某個條件的子串等
    2021-11-11
  • 詳解C語言數(shù)據(jù)結(jié)構(gòu)之棧

    詳解C語言數(shù)據(jù)結(jié)構(gòu)之棧

    這篇文章主要為大家介紹了C語言數(shù)據(jù)結(jié)構(gòu)之棧,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • C++中int?main(int?argc,?char**?argv)的參數(shù)使用

    C++中int?main(int?argc,?char**?argv)的參數(shù)使用

    int?main(int?argc,?char**?argv)?是C和C++程序的入口點(diǎn),其中argc和argv是用來接收從命令行傳遞給程序的參數(shù)的,本文就來介紹一下這兩個參數(shù)的含義,感興趣的可以了解一下的相關(guān)資料
    2024-01-01
  • C++和C中const的區(qū)別詳解

    C++和C中const的區(qū)別詳解

    這篇文章主要為大家介紹了C++和C中const的區(qū)別,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-11-11
  • 淺析c#中如何在form的webbrowser控件中獲得鼠標(biāo)坐標(biāo)

    淺析c#中如何在form的webbrowser控件中獲得鼠標(biāo)坐標(biāo)

    以下是對c#中如何在form的webbrowser控件中獲得鼠標(biāo)坐標(biāo)的實(shí)現(xiàn)方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以參考下
    2013-07-07

最新評論

阿拉善盟| 灯塔市| 永安市| 渑池县| 岳阳市| 行唐县| 海南省| 胶南市| 从江县| 固阳县| 汝阳县| 寿阳县| 黄龙县| 黑河市| 遂平县| 毕节市| 鄂尔多斯市| 深泽县| 淮安市| 柘城县| 民权县| 托克托县| 禹州市| 延津县| 张家界市| 延吉市| 扶风县| 喜德县| 徐闻县| 禹城市| 吉林市| 怀仁县| 馆陶县| 抚州市| 读书| 弋阳县| 海阳市| 商洛市| 黔西县| 中卫市| 陆河县|