C++实现判断一个字符串是否为UTF8或GBK格式的方法
本文实例讲述了C++实现判断一个字符串是否为UTF8或GBK格式的方法。分享给大家供大家参考,具体如下:
在处理外部数据的时候,很可能因为数据格式不一样而导致乱码,甚至导致某些程序挂掉。鉴于对多数系统来说,使用是更被广泛使用的utf8,所以判断是不是utf8格式显得很重要了。
下面是一个判断字符串是否为utf8的函数:
boolis_str_utf8(constchar*str) { unsignedintnBytes=0;//UFT8可用1-6个字节编码,ASCII用一个字节 unsignedcharchr=*str; boolbAllAscii=true; for(unsignedinti=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; } elseif(chr>=0xF8){ nBytes=5; } elseif(chr>=0xF0){ nBytes=4; } elseif(chr>=0xE0){ nBytes=3; } elseif(chr>=0xC0){ nBytes=2; } else{ returnfalse; } nBytes--; } } else{ //多字节符的非首字节,应为10xxxxxx if((chr&0xC0)!=0x80){ returnfalse; } //减到为零为止 nBytes--; } } //违返UTF8编码规则 if(nBytes!=0){ returnfalse; } if(bAllAscii){//如果全部都是ASCII,也是UTF8 returntrue; } returntrue; }
关于utf8的一般性简介和二进制格式可以参考百度百科。同样关于GBK的判断,也是使用的同样的方法,具体代码如下:
boolis_str_gbk(constchar*str) { unsignedintnBytes=0;//GBK可用1-2个字节编码,中文两个,英文一个 unsignedcharchr=*str; boolbAllAscii=true;//如果全部都是ASCII, for(unsignedinti=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{ returnfalse; } nBytes--; } } else{ if(chr<0x40||chr>0xFE){ returnfalse; } nBytes--; }//elseend } if(nBytes!=0){//违返规则 returnfalse; } if(bAllAscii){//如果全部都是ASCII,也是GBK returntrue; } returntrue; }
按照编码规则这么写,是正确的。但鉴于现在的utf8对于中文一般都是三个字节,而且utf8的编码规则存在重合,如果是utf8,使用上面的这个函数,就会出现一个尴尬的问题,当中文字符为奇数个判断正确,为则偶数个无法区别。
最后:如果谁有更好的办法判断一个字符串是否为GBK格式,欢迎告知。
希望本文所述对大家C++程序设计有所帮助。