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

来源:互联网 发布:如何下载ppt软件 编辑:程序博客网 时间:2024/06/10 22:28

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互转,参照博客点击打开链接

0 0
原创粉丝点击