国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

C++實現判斷一個字符串是否為UTF8或GBK格式的方法

2020-05-23 13:37:13
字體:
來源:轉載
供稿:網友

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

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

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

bool is_str_utf8(const char* str){  unsigned int nBytes = 0;//UFT8可用1-6個字節編碼,ASCII用一個字節  unsigned char chr = *str;  bool bAllAscii = true;  for (unsigned int i = 0; str[i] != '/0'; ++i){    chr = *(str + i);    //判斷是否ASCII編碼,如果不是,說明有可能是UTF8,ASCII用7位編碼,最高位標記為0,0xxxxxxx    if (nBytes == 0 && (chr & 0x80) != 0){      bAllAscii = false;    }    if (nBytes == 0) {      //如果不是ASCII碼,應該是多字節符,計算字節數      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{      //多字節符的非首字節,應為 10xxxxxx      if ((chr & 0xC0) != 0x80){        return false;      }      //減到為零為止      nBytes--;    }  }  //違返UTF8編碼規則  if (nBytes != 0) {    return false;  }  if (bAllAscii){ //如果全部都是ASCII, 也是UTF8    return true;  }  return true;}

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

bool is_str_gbk(const char* str){  unsigned int nBytes = 0;//GBK可用1-2個字節編碼,中文兩個 ,英文一個  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) {   //違返規則    return false;  }  if (bAllAscii){ //如果全部都是ASCII, 也是GBK    return true;  }  return true;}

按照編碼規則這么寫,是正確的。但鑒于現在的utf8對于中文一般都是三個字節,而且utf8的編碼規則存在重合,如果是utf8,使用上面的這個函數,就會出現一個尷尬的問題,當中文字符為奇數個判斷正確,為則偶數個無法區別。

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

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


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 汝南县| 漳州市| 洛南县| 芒康县| 鸡泽县| 灌阳县| 鄂尔多斯市| 垦利县| 谢通门县| 玛沁县| 大城县| 宿松县| 上高县| 日喀则市| 佛坪县| 武山县| 柳河县| 南华县| 淮安市| 新晃| 信阳市| 敖汉旗| 北流市| 连云港市| 沿河| 孝昌县| 楚雄市| 临城县| 石棉县| 泾川县| 金秀| 博野县| 长子县| 凤冈县| 桑植县| 宝应县| 梁河县| 文山县| 南华县| 宜良县| 松潘县|