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

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

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;
}


你可能感兴趣的:(linux c语言判断字符串是否是utf8)