如何判断一个文本文件内容的编码格式 UTF-8 ? ANSI(GBK)
2015-01-13 21:13
627 查看
UTF-8编码的文本文档,有的带有BOM (Byte Order Mark, 字节序标志),即0xEF, 0xBB, 0xBF,有的没有。Windows下的txt文本编辑器在保存UTF-8格式的文本文档时会自动添加BOM到文件头。在判断这类文档时,可以根据文档的前3个字节来进行判断。然而BOM不是必需的,而且也不是推荐的。对不希望UTF-8文档带有BOM的程序会带来兼容性问题,例如Java编译器在编译带有BOM的UTF-8源文件时就会出错。而且BOM去掉了UTF-8一个期望的特性,即是在文本全部是ASCII字符时UTF-8是和ASCII一致的,即UTF-8向下兼容ASCII。
在具体判断时,如果文档不带有BOM,就无法根据BOM做出判断,而且IsTextUnicode API也无法对UTF-8编码的Unicode字符串做出判断。那在编程判断时就要根据UTF-8字符编码的规律进行判断了。
UTF-8是一种多字节编码的字符集,表示一个Unicode字符时,它可以是1个至多个字节,在表示上有规律:
1字节:0xxxxxxx
2字节:110xxxxx 10xxxxxx
3字节:1110xxxx 10xxxxxx 10xxxxxx
4字节:11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
这样就可以根据上面的特征对字符串进行遍历来判断一个字符串是不是UTF-8编码了。应该指出的是UTF-8字符串的各个字节的取值有一定的范围,并不是所有的值都是有效的UTF-8字符,但是一般的应用的情况下这样的判断在对足够长的字符串及是比较精确了,而且实现也比较简单。具体的字节取值范围可以参见"Unicode Explained"一书中的6.4.3。另外BOM本身也符合3字节UTF-8字符编码规律,所以本方法对带BOM的UTF-8字符串也是有效的。
1. 判断文本是否UTF编码
在下面程序中对最大3字节长的UTF-8字符进行了判断,在实际情况下,几乎所有能用到的UTF-8字符最长就是3个字节
2. 判断文件是否UTF-8编码:
在具体判断时,如果文档不带有BOM,就无法根据BOM做出判断,而且IsTextUnicode API也无法对UTF-8编码的Unicode字符串做出判断。那在编程判断时就要根据UTF-8字符编码的规律进行判断了。
UTF-8是一种多字节编码的字符集,表示一个Unicode字符时,它可以是1个至多个字节,在表示上有规律:
1字节:0xxxxxxx
2字节:110xxxxx 10xxxxxx
3字节:1110xxxx 10xxxxxx 10xxxxxx
4字节:11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
这样就可以根据上面的特征对字符串进行遍历来判断一个字符串是不是UTF-8编码了。应该指出的是UTF-8字符串的各个字节的取值有一定的范围,并不是所有的值都是有效的UTF-8字符,但是一般的应用的情况下这样的判断在对足够长的字符串及是比较精确了,而且实现也比较简单。具体的字节取值范围可以参见"Unicode Explained"一书中的6.4.3。另外BOM本身也符合3字节UTF-8字符编码规律,所以本方法对带BOM的UTF-8字符串也是有效的。
1. 判断文本是否UTF编码
在下面程序中对最大3字节长的UTF-8字符进行了判断,在实际情况下,几乎所有能用到的UTF-8字符最长就是3个字节
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; }
2. 判断文件是否UTF-8编码:
bool CConvertCharset::IsUTF8File(const char* pFileName) { FILE *f = NULL; fopen_s(&f, pFileName, "rb"); if (NULL == f) { return false; } fseek(f, 0, SEEK_END); long lSize = ftell(f); fseek(f, 0, SEEK_SET); //或rewind(f); char *pBuff = new char[lSize + 1]; memset(pBuff, 0, lSize + 1); fread(pBuff, lSize, 1, f); fclose(f); bool bIsUTF8 = IsUTF8Text(pBuff, lSize); delete []pBuff; pBuff = NULL; return bIsUTF8; }
相关文章推荐
- 如何判断一个文本文件内容的编码格式 UTF-8 ? ANSI(GBK)
- 如何判断一个文件的编码格式是gb2312还是gbk等
- 如何判断一个txt文件的编码格式
- C#怎么判断一个文件的编码格式是UTF-8 without BOM的啊
- 在QT中,当BOM头不存在的时候,判断一个文件是否为UTF-8编码格式
- linux shell 批量更改文件编码格式 gbk到utf-8
- 如何将一个GBK编码的文本文件转存为一个UTF-8编码的文本文件
- 编码格式简介(ANSI、GBK、GB2312、UTF-8、GB18030和 UNICODE)
- 如何将右键新建文本文档默认编码设为UTF-8格式
- 如何判断文件的编码格式
- 用PHP如何判断一个文件的编码?
- iphone阅读器,如果要读取一个文本文件,请问你是如何处理编码问题的?另外像pdf格式的文件,你如何读取。?
- 如何获取一个URL传参编码是UTF-8还是GBK的取巧解决方法
- 文本读写与编码格式(1)----文本格式判断(基于文件的FileMap)
- 编码格式简介(ANSI、GBK、GB2312、UTF-8、GB18030和 UNICODE)
- Linux下如何查看一个文件,如temp.txt 内容的编码方式?
- Linux Unicode 编程--C语言如何使用/生成UTF-8编码格式的文件
- 如何使用Java代码将GBK编码格式的工程转换为UTF-8编码格式的工程
- 无BOM的条件下C语言判断一个文件是否为UTF-8编码代码(windows,linux通用)
- Java实现将GBK编码格式的文件夹中所有文件都转化为UTF-8格式的文件,编码格式转化