linux c语言判断字符串是否是utf8

时间:2023-01-10 17:28:12

项目开发用到这个功能,记下来也分享给大家,你根据自己系统中定义一下布尔类型宏即可,直接上代码吧

nopoll_bool ras_is_text_utf8(const char* str,long length)
{
int i;
//UFT8可用1-6个字节编码,ASCII用一个字节
int nBytes=0;
unsigned char chr;
//如果全部都是ASCII, 说明不是UTF-8
nopoll_bool bAllAscii=nopoll_true;
for(i=0;i<length;i++)
{
chr= *(str+i);
// 判断是否ASCII编码,如果不是,说明有可能是UTF-8,ASCII用7位编码,但用一个字节存,最高位标记为0,o0xxxxxxx
if( (chr&0x80) != 0 )
{
bAllAscii= nopoll_false;
}
//如果不是ASCII码,应该是多字节符,计算字节数
if(nBytes==0)
{
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 nopoll_false;
}
nBytes--;
}
}
//多字节符的非首字节,应为 10xxxxxx
else
{
if( (chr&0xC0) != 0x80 )
{
return nopoll_false;
}
nBytes--;
}
}
//违返规则
if( nBytes > 0 )
{
return nopoll_false;
}
//如果全部都是ASCII, 也是字符串
if( bAllAscii )
{
return nopoll_true;
}
return nopoll_true;
}