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++程序设计有所帮助。