判断文件是否为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 ...
随机推荐
- ASP.NET导出EXCEL类
最新ASP.NET导出EXCEL类 说明:可以导出ASP.NET页面和DATAGRID(WebControl)数据,可以导出表单头 using System;using System.Data;usi ...
- 【整理】Visual Studio快捷键
说明 很多开发人员使用Visual Studio的时候,由于对VS快捷键不熟悉,会影响到实际的开发效率.其实,有很多我们不知道(或已知)的快捷键,在我们熟练运用以后,能够提高我们整体的工作效率.以下是 ...
- bzoj 1061 [Noi2008]志愿者招募(数学模型,MCMF)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1061 [题意] 雇人满足每天至少需要的人数. [思路一] Byvoid的题解 clic ...
- 将“Cocos2dx-截屏并设置图片尺寸 ”中cocos2d-x代码转换为2.2的代码
Cocos2dx-截屏并设置图片尺寸: http://www.cocos2dev.com/?p=522 2.2 代码如下: void HelloWorld::screenShoot() { CCSiz ...
- homework-1
看到这个题目开始我只能想到动态规划四个字,但具体采用什么方法,如何写成代码却还未成型.动态规划的典型特点就是利用之前的结果.于是我很快想到了之前一个比较典型的小程序,即求最长的连续字符串.这两个题目有 ...
- 丁又专老师作业——Java检测代码
package com.util; import java.io.*; import java.util.regex.Pattern; /** * 代码统计工具 * 统计某个java源文件或某个目录中 ...
- JDBC学习笔记(7)——事务的隔离级别&批量处理
数据库事务的隔离级别 对于同时运行的多个事务, 当这些事务访问数据库中相同的数据时, 如果没有采取必要的隔离机制, 就会导致各种并发问题:脏读: 对于两个事务 T1, T2, T1 读取了已经被 T2 ...
- HDU 5794 A Simple Chess (容斥+DP+Lucas)
A Simple Chess 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5794 Description There is a n×m board ...
- Codeforces 602B Approximating a Constant Range(想法题)
B. Approximating a Constant Range When Xellos was doing a practice course in university, he once had ...
- AVCaptureSession 照相时获取 AVCaptureVideoPreviewLayer尺寸
http://stackoverflow.com/questions/14153878/avcapturesession-preset-photo-and-avcapturevideopreviewl ...