判断文件是否为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 ...
随机推荐
- HDU5739 Fantasia 树形dp + 点双缩点
这个题当时打多校的时候有思路,但是代码能力差,没有写出来 事后看zimpha巨巨的题解,看了觉得基本差不多 核心思路:就是找出割点,然后变成森林,然后树形dp就可以搞了 关键就在重新构图上,缩完点以后 ...
- TortoiseHg简单的入门使用说明
参考资料: 互普的 TortoiseHg使用说明_百度文库 Mercurial(Hg)基本操作 - Tim Gong - 博客园 Mercurial与TortoiseHg使用入门教程(转) - mee ...
- 基于MFC和opencv的FFT
在网上折腾了一阵子,终于把这个程序写好了,程序是基于MFC的,图像显示的部分和获取图像的像素点是用到了opencv的一些函数,不过FFT算法没有用opencv的(呵呵,老师不让),网上的二维的FFT程 ...
- C#调用C++导出类(转)
由于使用别人的Dll,导出的是一个实体类,在C#里封送很难,百度下,有个朋友回复一篇英文的,虽然不一定使用,但可以作为一个知识点,现把原文贴下: c#调用C++写的dll导出类,包含继承,重载等详细介 ...
- window.parent 判断是否是被嵌入iframe里面
项目中有个这样逻辑:B页面嵌套A页面 如图下: 但是B页面有可能独立出来.所以判断B页面是否被嵌入进去则使用 window.parent==window 如果是true B页面是独立的,false B ...
- 详解 jupyter notebook 集成 spark 环境安装
来自: 代码大湿 代码大湿 1 相关介绍 jupyter notebook是一个Web应用程序,允许你创建和分享,包含活的代码,方程的文件,可视化和解释性文字.用途包括:数据的清洗和转换.数值模拟.统 ...
- ocp 1Z0-051 141-175题解析
141. View the Exhibitand examine the structure of CUSTOMERS and GRADES tables. You need to displayna ...
- HDU 5842 Lweb and String (水题)
Lweb and String 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5842 Description Lweb has a string S ...
- CodeForces 682E Alyona and Triangles (计算几何)
Alyona and Triangles 题目连接: http://acm.hust.edu.cn/vjudge/contest/121333#problem/J Description You ar ...
- uva 315 Network(无向图求割点)
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...