判断文件是否为UTF8编码
utf8的规则比较简单:
- 对于UTF-8编码中的任意字节B,如果B的第一位为0,则B为ASCII码,并且B独立的表示一个字符;
- 如果B的第一位为1,第二位为0,则B为一个非ASCII字符(该字符由多个字节表示)中的一个字节,并且不为字符的第一个字节编码;
- 如果B的前两位为1,第三位为0,则B为一个非ASCII字符(该字符由多个字节表示)中的第一个字节,并且该字符由两个字节表示;
- 如果B的前三位为1,第四位为0,则B为一个非ASCII字符(该字符由多个字节表示)中的第一个字节,并且该字符由三个字节表示;
- 如果B的前四位为1,第五位为0,则B为一个非ASCII字符(该字符由多个字节表示)中的第一个字节,并且该字符由四个字节表示;
通过二进制表示如下:
0xxxxxxx (一位的情况,为ASCII)
110xxxxx 10xxxxxx (110开头,代表两位)
1110xxxx 10xxxxxx 10xxxxxx (1110开头代表三位)
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx (11110开头代表四位)
111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx (111110开头,代表五位)
1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx (1111110开头,代表六位)
符合以上规则的,就代表为符合utf8编码规则,否则为不符合
代码实现如下:
bool isUTF8(char* rawtext)
{
int score = ;
int i, rawtextlen = ;
int goodbytes = , asciibytes = ; rawtextlen = strlen(rawtext);
for (i = ; i < rawtextlen; i++)
{
if ((rawtext[i] & 0x7F) == rawtext[i])
{
//最高位是0的ASCII字符
//一位编码的情况
asciibytes++;
}
else if (- <= rawtext[i] && rawtext[i] <= -
//两位编码的情况,第一位11000000--11011111
//后一位跟10000000--10111111
&&i + < rawtextlen
&& - <= rawtext[i + ] && rawtext[i + ] <= -)
{
goodbytes += ;
i++;
}
else if (- <= rawtext[i]&& rawtext[i] <= -
//三位编码的情况,第一位11100000--11101111
//后两位跟10000000--10111111
&&i + < rawtextlen
&& - <= rawtext[i + ] && rawtext[i + ] <= -
&& - <= rawtext[i + ] && rawtext[i + ] <= -)
{
goodbytes += ;
i += ;
}
else if(- <= rawtext[i]&& rawtext[i] <= -
//四位编码的情况,第一位11110000--11110111
//后三位跟10000000--10111111
&&i + < rawtextlen
&& - <= rawtext[i + ] && rawtext[i + ] <= -
&& - <= rawtext[i + ] && rawtext[i + ] <= -
&& - <= rawtext[i + ] && rawtext[i + ] <= -) {
goodbytes += ;
i += ;
}
else if(- <= rawtext[i]&& rawtext[i] <= -
//五位编码的情况,第一位11111000--11111011
//后四位跟10000000--10111111
&&i + < rawtextlen
&& - <= rawtext[i + ] && rawtext[i + ] <= -
&& - <= rawtext[i + ] && rawtext[i + ] <= -
&& - <= rawtext[i + ] && rawtext[i + ] <= -
&& - <= rawtext[i + ] && rawtext[i + ] <= -)
{
goodbytes += ;
i += ;
}
else if(- <= rawtext[i]&& rawtext[i] <= -
//六位编码的情况,第一位11111100--11111101
//后五位跟10000000--10111111
&&i + < rawtextlen
&& - <= rawtext[i + ] && rawtext[i + ] <= -
&& - <= rawtext[i + ] && rawtext[i + ] <= -
&& - <= rawtext[i + ] && rawtext[i + ] <= -
&& - <= rawtext[i + ] && rawtext[i + ] <= -
&& - <= rawtext[i + ] && rawtext[i + ] <= -)
{
goodbytes += ;
i += ;
}
}
if (asciibytes == rawtextlen)
{
return true;
}
score = * goodbytes / (rawtextlen - asciibytes);
//如果匹配率达到98%以上,则成功
//允许一部分脏数据
if (score > )
{
return true;
}
else if (score > && goodbytes > )
{
return true;
}
else
{
return false;
}
}
判断文件是否为UTF8编码的更多相关文章
- 利用js判断文件是否为utf-8编码
常规方案 使用FileReader以utf-8格式读取文件,根据文件内容是否包含乱码字符�,来判断文件是否为utf-8. 如果存在�,即文件编码非utf-8,反之为utf-8. 代码如下: const ...
- Linux中将一个GBK编码的文件转换成UTF-8编码文件
Linux中将一个GBK编码的文件转换成UTF-8编码文件 使用iconv 命令iconv -f GBK -t UTF-8 file1 -o file2 输出另一个文件,然后再覆盖源文件内容
- 判断字符串是否为UTF8编码
UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码.由Ken Thompson于1992年创建.现在已经标准化为RFC 36 ...
- 修改Myeclipse的文件默认为UTF-8编码
一.工程编码默认调整 windows->Preferences...打开"首选项"对话框, 左侧导航树,导航到general->Workspace,右侧 Text fi ...
- python3.x 读写文件要使用UTF8编码的话需要。。
读写文件常遇到编码不正确的情况,都用UTF8读写文件就好了,在读写的时候加上编码格式:encoding='UTF-8'如下:with open(filename, 'r', encoding='UTF ...
- 【Java文件】按UTF-8编码读取文本文件(逐行方式),排序,打印到控制台
代码: package findJavaMemberFunction; import java.io.BufferedReader; import java.io.FileInputStream; i ...
- Python读取UTF-8编码文件并使用命令行执行时输出结果的问题
最近参加了由CCF举办的数据挖掘比赛,主办方提供了csv格式的数据文件,由于中文显示乱码的问题,我先用txt文本编辑器将编码改为utf-8格式,但是在读取文件并输出读取结果时发生了问题,代码如下: # ...
- 检测字节流是否是UTF8编码
几天前偶尔看到有人发帖子问“如何自动识别判断url中的中文参数是GB2312还是Utf-8编码” 也拜读了wcwtitxu使用巨牛的正则表达式检测UTF8编码的算法. 使用无数或条件的正则表达式用起来 ...
- ASP.NET中将导出的数据以UTF-8编码方式进行存储
Response.Charset = "UTF-8"; Response.ContentEncoding = Encoding.UTF8; Response.AppendHea ...
随机推荐
- C++ STL算法系列1---count函数
一.count函数 algorithm头文件定义了一个count的函数,其功能类似于find.这个函数使用一对迭代器和一个值做参数,返回这个值出现次数的统计结果. 编写程序读取一系列int型数据,并将 ...
- MFC ListControl用法
http://blog.csdn.net/lovton/article/details/6527208 1.建立一个对象m_LogList 步骤:在对话listcontrol控件右键点击添加变量-&g ...
- 《Python 学习手册4th》 第十七章 作用域
''' 时间: 9月5日 - 9月30日 要求: 1. 书本内容总结归纳,整理在博客园笔记上传 2. 完成所有课后习题 注:“#” 后加的是备注内容 (每天看42页内容,可以保证月底看完此书) “重点 ...
- [原创]谷歌插件 - YE启动助手(YeLauncher)
版本:v1.1 更新时间:2013/11/01 * 代码完善 + 右键关于显示当前版本号,点击并链接到软件帮助页 版本:v1.0 更新时间:2013/10/20 + 插件原型
- 用matlab绘制幂函数
用matlab绘制幂函数 下周轮到我做论文汇报了,刚好前两天看了网格水印的文章,就决定汇报前两天看到的那篇论文了.在准备ppt的过程中,绘制了一些幂函数,感觉matlab真的是很强大啊,可以绘制各种曲 ...
- 基于MFC和opencv的FFT
在网上折腾了一阵子,终于把这个程序写好了,程序是基于MFC的,图像显示的部分和获取图像的像素点是用到了opencv的一些函数,不过FFT算法没有用opencv的(呵呵,老师不让),网上的二维的FFT程 ...
- bzoj 1778 [Usaco2010 Hol]Dotp 驱逐猪猡(高斯消元)
[题意] 炸弹从1开始运动,每次有P/Q的概率爆炸,否则等概率沿边移动,问在每个城市爆炸的概率. [思路] 设M表示移动一次后i->j的概率.Mk为移动k次后的概率,则有: Mk=M^k 设S= ...
- bzoj 3143 [Hnoi2013]游走(贪心,高斯消元,期望方程)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3143 [题意] 给定一个无向图,从1走到n,走过一条边得到的分数为边的标号,问一个边的 ...
- Java学习笔记(3)
“当你定义出一组类的父型时,你可以用子型的任何类来填补任何需要或期待父型的位置” “运用多态时,引用类型可以是实际对象类型的父类”Animal myDog = new Dog(); 三种方法可以防止某 ...
- A题进行时--浙大PAT 1011-1020
#include<stdio.h> #include<string.h> int main(){ ]; ]; ]; ]; ]; int i; float sum; memset ...