如何判断一个文本文件内容的编码格式 UTF-8 ? ANSI(GBK)
来源:互联网 发布:淘宝上的官换机靠谱吗 编辑:程序博客网 时间:2024/04/29 15:43
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个字节
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)
- 将一个ANSI编码格式纯文本文件以UTF-8的形式读到另一个文件中去
- //将一个ANSI编码格式纯文本文件以UTF-8的形式读到另一个文件中去
- 文本文件及二进制文件的大小, Unicode/utf-8/ansi编码格式
- utf-8、unicode、gbk、gb2312、ANSI编码的区别
- 判断一个文本文件的编码格式
- 判断一个文本文件的编码格式
- 判断一个文本文件的编码格式(转)
- 判断一个文本文件的编码格式
- 判断一个文本文件的编码格式
- 如何判断文本文件的编码格式?
- 如何判断文本文件的编码格式?
- 如何判断文本文件的编码格式?
- Native2asciiUtil 文本文件转UNICODE编码文件(支持UTF-8,Unicode,UTF-16BE,ANSI|ASCII,GBK)
- 用IO流技术-将GBK格式的文本文件转存为UTF-8格式的文本文件
- 编码格式简介(ANSI、GBK、GB2312、UTF-8、GB18030和 UNICODE)
- 编码格式简介(ANSI、GBK、GB2312、UTF-8、GB18030和 UNICODE)
- 编码格式简介(ANSI、GBK、GB2312、UTF-8、GB18030和 UNICODE) .
- Sicily 4422. Boat Game
- 浏览器功能IDEA开发
- C# 委托
- 【机器学习基础】将回归模型用于分类问题
- 38-UI基础常见问题(UIButton和UIImage区别,UIImage两种加载方式区别,frame,bounds,center作用和区别)
- 如何判断一个文本文件内容的编码格式 UTF-8 ? ANSI(GBK)
- bypass waf 进行post注入
- 通过设备数配制am335x/BB-B IO口或 led 方法详解
- IO流学习总结
- An Evaluation Framework for MPEG video transmission in NS2 environment
- 如何忘却jQuery,开始使用JavaScript原生API
- Lucene 4.4 以后近实时NRT检索
- MP4 全介绍【转载】
- java基础之try,catch,finally中的return