#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
using namespace std; enum TEXT_TYPE
{
TEXT_ANSI = 0,
TEXT_UTF8 = 1,
TEXT_UTF8_BOM = 2,
TEXT_UTF16_LE = 3,
TEXT_UTF16_BE = 4,
TEXT_UNKNOW = 5,
}; //检查是否为无BOM的UTF8
bool check_utf8_without_bom(const string &file_name)
{
ifstream file_in;
file_in.open(file_name, ios::in); if (!file_in.is_open())
{
cout << "打开文件失败" << endl;
return false;
} stringstream buffer;
buffer << file_in.rdbuf();
file_in.close();
string text = buffer.str(); size_t len = text.size();
int n = 0;
unsigned char ch;
bool b_all_ascii = true; //0x00-0x7F为ASCII码范围 for (size_t i = 0; i < len; ++i)
{
ch = text[i]; if ((ch & 0x80) != 0)
{
b_all_ascii = false;
} if (n == 0)
{
if (ch >= 0x80)
{
if (ch >= 0xFC && ch <= 0xFD)
{
n = 6;
}
else if (ch >= 0xF8)
{
n = 5;
}
else if (ch >= 0xF0)
{
n = 4;
}
else if (ch >= 0xE0)
{
n = 3;
}
else if (ch >= 0xC0)
{
n = 2;
}
else
{
return false;
}
n--;
}
}
else
{
if ((ch & 0xC0) != 0x80)//在UTF-8中,以位模式10开始的所有字节是多字节序列的后续字节
{
return false;
}
n--;
}
} if (n > 0)
{
return false;
} if (b_all_ascii)
{
return false;
} return true;
} //检查文本编码
TEXT_TYPE check_text_encode(const string &file_name)
{
/*
ANSI 无格式定义 对于中文编码格式是GB2312;
Unicode little endian 文本里前两个字节为FF FE 字节流是little endian
Unicode big endian 文本里前两个字节为FE FF 字节流是big endian
UTF-8带BOM 前两字节为EF BB,第三字节为BF 带BOM
UTF-8不带BOM 无格式定义,需另加判断 不带BOM
*/ ifstream file_in(file_name, ios::binary);
if (!file_in.is_open())
{
cout << "打开文件失败" << endl;;
return TEXT_UNKNOW;
} int head;
unsigned char ch;
file_in.read((char*)&ch, sizeof(ch));
head = ch << 8;
file_in.read((char*)&ch, sizeof(ch));
head |= ch; file_in.close();
TEXT_TYPE result_code;
switch (head)
{
case 0xFFFE:
result_code = TEXT_UTF16_LE;
break;
case 0xFEFF:
result_code = TEXT_UTF16_BE;
break;
case 0xEFBB:
result_code = TEXT_UTF8_BOM;
break;
default:
if (check_utf8_without_bom(file_name))
result_code = TEXT_UTF8;
else
result_code = TEXT_ANSI;
break;
}
return result_code;
} int main(int argc, char* argv[])
{
string str1 = "E:\\Book\\ANSI.txt";
string str2 = "E:\\Book\\UTF8.txt";
string str3 = "E:\\Book\\UTF8_BOM.txt"; TEXT_TYPE txttype1 = check_text_encode(str1);
TEXT_TYPE txttype2 = check_text_encode(str2);
TEXT_TYPE txttype3 = check_text_encode(str3); getchar();
return 0;
}

参考链接:

https://www.jb51.net/article/128576.htm

https://www.cnblogs.com/Toya/p/11433441.html

C++判断文本编码的更多相关文章

  1. node.js整理 03文件操作-遍历目录和文本编码

    遍历目录 递归算法 遍历目录时一般使用递归算法,否则就难以编写出简洁的代码. 递归算法与数学归纳法类似,通过不断缩小问题的规模来解决问题 function factorial(n) { if (n = ...

  2. Python: 转换文本编码

    最近在做周报的时候,需要把csv文本中的数据提取出来制作表格后生产图表. 在获取csv文本内容的时候,基本上都是用with open(filename, encoding ='UTF-8') as f ...

  3. 2018-8-10-C#-判断文件编码

    title author date CreateTime categories C# 判断文件编码 lindexi 2018-08-10 19:16:52 +0800 2018-2-13 17:23: ...

  4. [2015.02.02]文本编码转换专家 v2.6

    软件名称:文本编码转换专家最新版本:v2.6操作系统:XP/2003/Win7/Win2008软件介绍:文本编码转换专家,界面简洁易用,功能强大实用.自动识别文件编码,有效转换成目标编码.真正的多线程 ...

  5. mac 文本编辑器 文本编码Unicode utf-8 不适用的问题

    在mac上使用默认的文本编辑器打开下载的xx.txt文件,如果文本是gbk的编码可能会出现 文本编码Unicode utf-8 不适用的打开错误,如下图 解决方式: 文本编辑---偏好设置-----打 ...

  6. Mac下用命令行直接批量转换文本编码到UTF8

    由于近期在Mac下写Android程序,下载的一些Demo由于编码问题源码里的汉字出现乱码,文件比较多,所以想批量解决下文件的编码问题. Mac下有以下两种方式可以解决: A. 文件名的编码:Mac的 ...

  7. 机房收费系统总结之4——VB.NET 轻松解决判断文本框、组合框为空问题

    纵观机房收费系统,判断文本框.组合框为空问题无非两种情况.第一种:判断窗体中所有文本框.组合框是否为空.第二种:判断一部分文本框.组合框是否为空.下面看看是如何实现这两种情况的. 第一种:判断窗体中所 ...

  8. EditText文本中用正则匹配是否包含数字,及判断文本只能是纯汉字或纯字母

    遇到判断EditText中文本,是否为制定格式 EditText et; Button btn; @Override protected void onCreate(Bundle savedInsta ...

  9. Java进阶(三十) 判断字符串编码类型

    java 判断字符串编码类型 public static String getEncoding(String str) { String encode = "GB2312"; tr ...

  10. 011_如何decode url及图片转为base64文本编码总结

    一.咱们经常会遇到浏览器给encode后的url,如何转换成咱们都能识别的url呢?很简单,talk is easy,Please show me your code,如下所示: (1)英文decod ...

随机推荐

  1. EPPlus使用方法---Excel处理我觉得超级好用

    目前只是用到导出Excel功能,导出大规模数据量速度也很快,而且比较容易操作(最起码导出是,暂时没有用到处理已存在的excel功能,有人说NPOI也好用,试了一下,最起码导出这个不如EPPlus    ...

  2. lottie-web动画库在HTML5页面中和在vue项目中的两种使用方式

    本文主要介绍lottie-web动画库在HTML5页面中和在vue项目中的两种使用方式. 1.在HTML5页面中的使用方式 具体使用步骤详见下面的代码: <!DOCTYPE html> & ...

  3. OGC——WMS服务

    一.引言 一直用arcgis javascript的二次开发,经常使用它的一些服务WMS.WMTS.WFS.MapService等,并没有深入了解这些服务内部机制,直到最近学习了geoserver,由 ...

  4. 阿里IM技术分享(四):闲鱼亿级IM消息系统的可靠投递优化实践

    本文由阿里闲鱼技术团队景松分享,原题"到达率99.9%:闲鱼消息在高速上换引擎(集大成)",有修订和改动,感谢作者的分享. 1.引言 在2020年年初的时候接手了闲鱼的IM即时消息 ...

  5. kubernetes系列(五) - kubernetes网络原理

    目录 前言 1. kubernetes网络模型 2. kubernetes的组件之间如何通讯 2.1 同一个pod内的多容器之间 2.2 各个pod直接的通讯 2.2.1 同一个节点上的pod互相通讯 ...

  6. .NET 响应式编程 System.Reactive 系列文章(三):Subscribe 和 IDisposable 的深入理解

    .NET 响应式编程 System.Reactive 系列文章(三):Subscribe 和 IDisposable 的深入理解 引言:为什么理解 Subscribe 和 IDisposable 很重 ...

  7. .NET Core:架构、特性和优势详解

    .NET Core:架构.特性和优势详解 在软件开发领域,保持领先地位至关重要.随着技术以指数级的速度发展,开发人员不断寻求高效.可扩展且多功能的解决方案来应对现代挑战..NET Core 就是这样一 ...

  8. Solution Set -「LOCAL」冲刺省选 Round XXVIII

    \(\mathscr{Summary}\)   A 题显然是图论模型嘛--但是卡得太久了,B 题 C 题都不好骗,裂开 qwq.   感觉时间安排上不尽合理,如果 B C 简单一点我这个就要挂打分了. ...

  9. Billyboss pg walkthough Intermediate window

    nmap ┌──(root㉿kali)-[/home/ftpuserr/nc.exe] └─# nmap -p- -A -sS 192.168.219.61 Starting Nmap 7.94SVN ...

  10. dart变量类型详解

    1==> 三个单引号的作用 String Str = ''' qijqowjdo 哈哈嘿嘿黑 '''; print(Str); 这样使用三个单引号,输出来换行:方便我们观看而已哈 2==> ...