c语言如何识别无BOM的UTF8文本

UTF-8编码的文本文档,有的带有BOM (Byte Order Mark, 字节序标志),即0xEF, 0xBB, 0xBF,有的没有。Windows下的文本编辑器在保存UTF-8格式的文本文档时会自动添加BOM到文件头。在判断这类文档时,可以根据文档的前3个字节来进行判断。

但是,如果文档不带有BOM,就无法根据BOM做出判断,那么那在编程判断时就要根据UTF-8字符编码的规律进行判断了。

uft8下字符的编码规律如下:

1字节:0xxxxxxx
2字节:110xxxxx 10xxxxxx
3字节:1110xxxx 10xxxxxx 10xxxxxx
4字节:11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

在实际情况下,几乎所有能用到的UTF-8字符最长就是3个字节。

下面程序仅对最大3字节长的UTF-8字符进行了判断,pBuffer为从文件中按二进制流读取的字节

bool IsUTF8(const void* pBuffer, long size)   
{   
    bool IsUTF8 = true;   
    unsigned char* start = (unsigned char*)pBuffer;   
    unsigned char* end = (unsigned char*)pBuffer + size;   
    while (start < end)   
    {   
        if (*start < 0x80) // (10000000): 值小于0x80的为ASCII字符   
        {   
            start++;   
        }   
        else if (*start < (0xC0)) // (11000000): 值介于0x80与0xC0之间的为无效UTF-8字符   
        {   
            IsUTF8 = false;   
            break;   
        }   
        else if (*start < (0xE0)) // (11100000): 此范围内为2字节UTF-8字符   
        {   
            if (start >= end - 1)    
                break;   
            if ((start[1] & (0xC0)) != 0x80)   
            {   
                IsUTF8 = false;   
                break;   
            }   
            start += 2;   
        }    
        else if (*start < (0xF0)) // (11110000): 此范围内为3字节UTF-8字符   
        {   
            if (start >= end - 2)    
                break;   
            if ((start[1] & (0xC0)) != 0x80 || (start[2] & (0xC0)) != 0x80)   
            {   
                IsUTF8 = false;   
                break;   
            }   
            start += 3;   
        }    
        else  
        {   
            IsUTF8 = false;   
            break;   
        }   
    }   
    return IsUTF8;   
}  
c语言实现Unicode与UTF-8互转,参照博客 点击打开链接

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值