#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. 安装OpenCV时提示缺少boostdesc_bgm.i文件的问题解决方案

    安装OpenCV时,会遇到下面的错误 /home/zhang/slam/opencv-3.4.5/opencv_contrib/modules/xfeatures2d/src/boostdesc.cp ...

  2. 在linux上Git配置多个SSH-Key

    Git配置多个SSH-Key SSH Key 背景 当有多个git账号时,比如: a. 一个gitee,用于公司内部的工作开发: b. 一个github,用于自己进行一些开发活动: c.一个gitla ...

  3. 上位机能不能替代PLC呢?

    一.前言 大家好!我是付工. 之前有个学员问了这样的一个问题: 学会了上位机,是不是就可以不用PLC了呢? 今天跟大家分享一下上位机能不能代替PLC? 二.网络架构 首先我们看下这张网络架构图. 从图 ...

  4. Solution -「NOI Simu.」逆天题

    \(\mathscr{Description}\)   对于 \(r=0,1,\cdots,n-1\), 设 \(\{1,2,\cdots,nm\}\) 中有 \(f_r\) 个子集满足子集内元素之和 ...

  5. JVM-总结列表

    第一章 JVM内存结构 1.为什么要了解JVM内存管理机制 JVM自动的管理内存的分配与回收,这会在不知不觉中浪费很多内存,导致JVM花费很多时间去进行垃圾回收(GC) 内存泄露,导致JVM内存最终不 ...

  6. 编写高性能java程序

    为什么你写的程序运行效率不高:为什么你的程序会OutOfMemory:为什么你的程序会经常OutOfMemory:看看你的编程习惯是否符合36计1.JVM 管理两种类型的内存:堆内存(heap),栈内 ...

  7. Event Store-其它存储

    背景 ENode是一个CQRS+Event Sourcing架构的开发框架,Event Sourcing需要持久化事件,事件可以持久化在DB,但是DB由于面向的是CRUD场景,是针对数据会不断修改或删 ...

  8. ClickHouse-2接口

    客户端 ClickHouse提供了两个网络接口(两个都可以选择包装在TLS中以增加安全性): HTTP, 包含文档,易于使用. Native TCP,简单,方便使用. 在大多数情况下,建议使用适当的工 ...

  9. Linux blkid命令

    Linux blkid命令:显示块设备属性. Linux blkid命令 功能描述 使用blkid命令可以用来查询系统的块设备(包括交换分区)所使用的文件系统类型.卷标.UUID等信息. Linux ...

  10. 利用JavaScript自定义事件完成组件间的数据通信

    我们知道,在JavaScript中,原生DOM事件在开发中是很有用的(与用户交互的重要方式),但是操作原生DOM事件其实有两大缺点:性能低.依赖于浏览器(NodeJs.小程序等不可用).那么这个时候, ...