c语言如何识别无BOM的UTF8文本
2017-01-28 20:49
1091 查看
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为从文件中按二进制流读取的字节
但是,如果文档不带有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互转,参照博客点击打开链接
相关文章推荐
- 如何写一个不带BOM的UTF8文件
- C语言中如何实现建立和写入文本文档
- 如何解决ABBYY FineReader中竖排或反转文本未识别问题
- C语言中文件操作--如何将文本数据正确读到字符串数组中
- 易语言如何识别文本是否全是数字
- C语言里如何把GBK码转换为UTF8?
- 如何使用PHP批量去除文件UTF8 BOM信息
- 如何使用PHP批量去除文件UTF8 BOM信息
- Win下新建文本为无BOM的UTF8编码的方法
- C语言自动识别文本编码
- C语言中如何在命令行中输入EOF,即文本结束符
- C语言中如何在命令行中输入EOF,即文本结束符
- 如何解决ABBYY FineReader中竖排或反转文本未识别问题
- lua中如何识别C语言中的struct
- 别人写的UNICODE的文本,汉字字符都可以用记事本查看,注意记事本识别编码的方式为BOM
- 【C语言】如何实现多行字符串的输入 并 将文本打印在屏幕上?
- C语言里如何把GBK转为UTF8?
- 如何在ABBYY FineReader中创建屏幕截图和识别文本
- 如何识别无BOM的UTF8文本
- 识别UTF8无BOM