转自:http://blog.csdn.net/jiangqin115/article/details/42684017

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个字节

 1 bool IsUTF8(const void* pBuffer, long size)  2 {  3     bool IsUTF8 = true;  4     unsigned char* start = (unsigned char*)pBuffer;  5     unsigned char* end = (unsigned char*)pBuffer + size;  6     while (start < end)  7     {  8         if (*start < 0x80) // (10000000): 值小于0x80的为ASCII字符    9         {
10             start++;
11         }
12         else if (*start < (0xC0)) // (11000000): 值介于0x80与0xC0之间的为无效UTF-8字符
13         {
14             IsUTF8 = false;
15             break;
16         }
17         else if (*start < (0xE0)) // (11100000): 此范围内为2字节UTF-8字符
18         {
19             if (start >= end - 1)
20             {
21                 break;
22             }
23
24             if ((start[1] & (0xC0)) != 0x80)
25             {
26                 IsUTF8 = false;
27                 break;
28             }
29
30             start += 2;
31         }
32         else if (*start < (0xF0)) // (11110000): 此范围内为3字节UTF-8字符
33         {
34             if (start >= end - 2)
35             {
36                 break;
37             }
38
39             if ((start[1] & (0xC0)) != 0x80 || (start[2] & (0xC0)) != 0x80)
40             {
41                 IsUTF8 = false;
42                 break;
43             }
44
45             start += 3;
46         }
47         else
48         {
49             IsUTF8 = false;
50             break;
51         }
52     }
53
54     return IsUTF8;
55 }  

2. 判断文件是否UTF-8编码:

 1 bool CConvertCharset::IsUTF8File(const char* pFileName)  2 {  3     FILE *f = NULL;  4     fopen_s(&f, pFileName, "rb");  5     if (NULL == f)  6     {  7         return false;  8     }  9
10     fseek(f, 0, SEEK_END);
11     long lSize = ftell(f);
12     fseek(f, 0, SEEK_SET);  //或rewind(f);
13
14     char *pBuff = new char[lSize + 1];
15     memset(pBuff, 0, lSize + 1);
16     fread(pBuff, lSize, 1, f);
17     fclose(f);
18
19     bool bIsUTF8 = IsUTF8Text(pBuff, lSize);
20     delete []pBuff;
21     pBuff = NULL;
22
23     return bIsUTF8;
24 }  

【转】如何判断一个文本文件内容的编码格式 UTF-8 ? ANSI(GBK)相关推荐

  1. 判断一个文本文件的编码格式

    判断一个文本文件的编码格式 不同编码的文本,是根据文本的前两个字节来定义其编码格式的.定义如下: ANSI:   无格式定义:  Unicode: 前两个字节为FFFE:  Unicode big e ...

  2. 用windows“记事本”创建一个文本文件(hamlet.txt),其中每行包含一段英文。试读出文件的全部内容,并判断:(1)该文本文件有多少行?(2)文件中以大写字母开头的有多少行?

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 题目: 代码: 效果截图: 总结 题目: 用windows"记事本"创建一个文本文件(hamlet.txt) ...

  3. 将磁盘上的一个文本文件的内容复制到另一个文件中

    <程序设计基础实训指导教程-c语言> ISBN 978-7-03-032846-5 p198 8.1.2 上级实训内容 [实训内容2]将磁盘上的一个文本文件的内容复制到另一个文件中 #in ...

  4. Java如何判断一个上传文件的内容类型

    关于如何判断一个文件的类型,在如何判断一个文件的类型_jimmyleeee的博客-CSDN博客已经介绍了,但是在实际运用于真正的文件上传时,还是有些注意事项需要注意的. 在进入主题之前,首先需要简单介 ...

  5. python判断输入的内容是否为一个数字(整数、负数)

    python判断输入的内容是否为一个数字 isdigit() 方法检测字符串是否只由数字组成,返回True或False def is_number(s):s = str(s)if s.count('. ...

  6. 判断包含字符当中包含小数点_Python|提取包含指定文本的行到一个文本文件(字符串或正则)...

    Python对于文本处理简单.直观. 任务:想返回一个网页的全部标题的文本行到一个文本文件. 在网页文件的源代码中,页面的标题都是用诸如 -- (后面的数字可以是1-6中任意数字)来标识的,要把这样的 ...

  7. [WINDOWS]多个文本文件内容合并到一个文本文件中

    将当前目录下,所有.txt后缀文件合并到一个文本文件中 方法: type *.txt > res.txt

  8. java解析txt文本文件_java读取文本文件内容方法详解,java如何读取txt文件?

    你知道java读取文本文件内容方式都有哪些吗?下面要给大家分享的就是比较简单的方法,一起来了解一下吧. 如何使用java实现读取TXT文件里的内容的方法以及思路: 下面先来看一下例子:import j ...

  9. lua 读取服务器文件是否存在,Lua判断一个目录或文件是否存在的方法

    Lua判断一个目录或文件是否存在的方法 一.使用io.open Open 一下就可以了. 复制代码 代码如下: file,err=io.open("XXXX") 如果文件正常打开 ...

最新文章

  1. CSS块级元素和行内元素
  2. imgkit分辨率_pythonhtml2image: imgkit 和 wkhtmltoimage的坑
  3. LightGBM中GBDT的实现
  4. C# FileStream
  5. linux安装数据库yum,linux 安装mysql数据库——yum安装法
  6. 市电220V说的是峰峰值还是有效值呢?
  7. 二阶系统级联_二阶系统时域特性.ppt
  8. Kali扫描工具Nmap
  9. 聚亚烷基二醇的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  10. 怎样用css3设计出向上向下的小箭头
  11. Vue 和 React 的diff有什么不同
  12. 互联网快讯:极米投影仪获用户青睐;粉笔科技创新OMO模式谋突围;华虹半导体拟科创板上市
  13. mangle和demangle
  14. 三个等号和两个等号的区别(“===”与“==”的区别)
  15. win10录屏软件哪款比较好用?一款不限时长的录屏软件
  16. KVM-2、虚拟化基础
  17. c# virtual 和 abstract
  18. android pdfview,android pdfview运行报错,求大神过来解答。跪谢
  19. 单片机能做什么,你有什么有单片机或开源硬件做的有意思的作品吗
  20. HP1022n网络打印机ip

热门文章

  1. hadoop join
  2. Linux 安装 lanmp
  3. java-web的mybatis的学习
  4. Storm环境搭建(分布式集群)
  5. ASP.NET MVC中的模型装配 封装方法 非常好用
  6. 可访问性不一致的原因与解决方法
  7. ASP.NET Web Froms开发模式中实现程序集的延迟加载
  8. td不允许自己扩展_V神原文详解:通过及时性检测器(TD)解决区块链的51%攻击问题...
  9. 废旧光盘手工小制作_废旧利用 | 幼儿园手工卷纸筒制作大全,超实用
  10. 《C语言深度解剖》中的.c/.h 程序模板及函数注释风格