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

转自: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 }  

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/436808.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

cesium获取模型实时坐标_Cesium 顶点着色器中求解模型坐标

1. 由世界坐标转模型坐标顶点着色器&#xff1a;attribute vec3 position3DHigh;attribute vec3 position3DLow;attribute vec3 normal;attribute vec2 st;attribute float batchId;varying vec3 v_positionEC;varying vec3 v_normalEC;varying vec2 v_st;void main(){vec3 pos…

【转】关于CLR内存管理一些深层次的讨论[上篇]

半年之前&#xff0c;PM让我在部门内部进行一次关于“内存泄露”的专题分享&#xff0c;我为此准备了一份PPT。今天无意中将其翻出来&#xff0c;觉得里面提到的关于CLR下关于内存管理部分的内存还有点意思。为此&#xff0c;今天按照PPT的内容写了一篇文章。本篇文章不会再讨论…

mysql数据库连接地址utf8_在Python中连接到MySQL数据库时UTF8不工作

我正在努力使Python更好地使用UTF-8编码的MySQL数据库&#xff0c;例如&#xff0c;挪威字符。我找了好几个小时&#xff0c;但没能找到像预期的那样有效的东西。以下是从数据库中提取的示例表&#xff1a;mysql> select * from my_table;---------------------| id | shop_…

【转】.NET Remoting

.Net Remoting提供了一种允许一个应用域中的对象与另一个应用域中的对象进行交互的框架。是.NET框架中的一个重要技术改进,它用于减轻运行应用程序的系统开销. 中文名 .Net Remoting 作 用 减轻运行应用程序的系统开销 目录 1 介绍2 .NET Remoting的原理 ▪ 1.NET Rem…

python多重赋值技巧_python教程12课:多元赋值、多重赋值、运算符以及判断字符串类型...

# 多元赋值&#xff1a;# x,y,z 和 1,2,‘String是两个元组&#xff0c;只不过元组的 () 被省略掉了x, y ,z 1, 2, Stringprint(x, y, z)(x, y ,z) (3, 4, String)print(x,y,z)# 一般用在交换变量值#交换变量值常规思路x 10,y 20z 30x ,y, z y,z,xprint(x,y,z)#使用多元赋值…

【转】关于CLR内存管理一些深层次的讨论[下篇]

《上篇》中我们主要讨论的是程序集&#xff08;Assembly&#xff09;和应用程序域&#xff08;AppDomain&#xff09;的话题&#xff0c;着重介绍了两个不同的程序集加载方式——独占方式和共享方式&#xff08;中立域方式&#xff09;&#xff1b;以及基于进程范围内的字符串驻…

python正则表达式处理txt_Python文本处理服务(re正则表达式例子)

正则表达式例子检查对子在此示例中&#xff0c;我们将使用以下帮助函数来更优雅地显示匹配对象&#xff1a;def displaymatch(match): if match is None: return None return % (match.group(), match.groups())假设你在写一个扑克程序&#xff0c;一个玩家的一手…

【转】深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第一节 理解堆与栈

理解堆与栈 导航 深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第一节 理解堆与栈 深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第二节 栈基本工作原理 深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第三节 栈与堆&#xff0c;值类型与引用类型 深入浅出图…

bi 存储过程方案_BI 系统中容易被忽视的数据源功能

BI 系统中容易被忽视的数据源功能用户在选购 BI 解决方案的时候&#xff0c;常常会更关注界面环节的功能指标&#xff0c;比如美观性、操作的流畅性、移动端支持等等。毕竟&#xff0c;BI 是要给业务人员使用的&#xff0c;这些看得见的内容一般不容易被遗漏。然而&#xff0c;…

【转】深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第二节 栈基本工作原理

栈基本工作原理 导航 深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第一节 理解堆与栈 深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第二节 栈基本工作原理 深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第三节 栈与堆&#xff0c;值类型与引用类型 深入浅…

matlab将二值图像与原图重叠_图像处理matlab及图像融合图像镶嵌图像拼接

要把double的图像(范围是0到1)再次转化为256灰度值的&#xff0c;可以这样Igrey uint8(I2*255)图像类型转换函数&#xff1a;dither() 通过颜色抖动&#xff0c;把真彩图像转换成索引图像或灰度图象转换成二值图像gray2ind() 将灰度图像(或二值图像)转换成索引图像grayslice() …

【转】深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第三节 栈与堆,值类型与引用类型

前言 虽然在.Net Framework 中我们不必考虑内在管理和垃圾回收(GC)&#xff0c;但是为了优化应用程序性能我们始终需要了解内存管理和垃圾回收(GC)。另外&#xff0c;了解内存管理可以帮助我们理解在每一个程序中定义的每一个变量是怎样工作的。 简介 本文将介绍值类型与引用类…

mysql udf sm4_SM4国密算法Java版

根据 国密SM4 文档 编写的一个Java 加密解密样例package javasm4;/**** author Jeen*/public class JavaSM4 {public static int[] key new int[4];//密钥public static int[] temp new int[4];//中间量 存储运算结果public static int[] rkey new int[32];//轮密钥public s…

【转】.net框架读书笔记---CLR内存管理\垃圾收集(一)

一、垃圾收集平台基本原理解析 在C#中程序访问一个资源需要以下步骤&#xff1a; 调用中间语言&#xff08;IL&#xff09;中的newobj指令&#xff0c;为表示某个特定资源的类型实例分配一定的内存空间。初始化上一步所得的内存&#xff0c;设置资源的初始状态&#xff0c;从而…

gperftools mysql_利用 gperftools 对nginx mysql 内存管理 性能优化

利用 gperftools 对nginx 与 mysql 进行 内存管理 性能优化 降低负载.Gperftools 是由谷歌开发。官方对gperftools 的介绍为&#xff1a;These tools are for use by developers so that they can create more robust applications. Especially of use to those developing m…

【转】.net框架读书笔记---CLR内存管理\垃圾收集(二)

前几天学习了CLR垃圾收集原理和基本算法&#xff0c;但是那些是仅仅相对于托管堆而言的&#xff0c;任何非托管资源的类型&#xff0c;例如文件、网络资源等&#xff0c;都必须支持一种称为终止化&#xff08;finalization&#xff09;的操作。 终止化 终止化操作允许一种资源…

python time 时间戳_Python的time.time()返回本地或UTC时间戳吗?

这是可以在文本文件中使用的时间戳记的文本形式。(问题的标题在过去是不同的&#xff0c;因此对此答案的介绍进行了更改&#xff0c;以阐明如何将其解释为时间。[2016年1月14日更新])您可以使用.now()或.utcnow()来将时间戳记作为字符串获取datetime.datetime&#xff1a;>&…

【转】.net框架读书笔记---CLR内存管理\垃圾收集(三)

接上一篇.net框架读书笔记---CLR内存管理\垃圾收集&#xff08;二&#xff09;&#xff0c;主要学习了终止化对象&#xff08;实现了Finalize方法的对象&#xff09;&#xff0c;了解了终止化对象的弊端&#xff0c;学习了通过实现IDisposable接口&#xff0c;通过Dispose方法来…

mysql实验三单表和多表查询_数据库实验三(单表查询)

实验三:select sno,snamefrom student;//(1)查询全体学生的学号和姓名select *from student;//(2)查询全体学生的详细记录select sname,sage,sdeptfrom student where sdeptMA;//(3)查询软件学院的学生姓名、年龄、系别select distinct snofrom sc;//(4)查询所有选修过课程的学…

【转】.net框架读书笔记---CLR内存管理\垃圾收集(四)

弱引用 当一个根指向一个对象时&#xff0c;该对象不可能被垃圾收集器收集&#xff0c;在这种情况下&#xff0c;通常说存在一个该对象的强引用&#xff08;strong reference&#xff09;。垃圾收集器还支持弱引用&#xff08;weak reference&#xff09;的概念。弱引用允许垃圾…