VC++ 读取UTF-8和ANSI编码文件
2023-09-14 08:57:14 时间
判断是否是UTF-8文件:
bool IsUTF8Text(const void* pBuffer, long size) { bool IsUTF8 = true; unsigned char* start = (unsigned char*)pBuffer; unsigned char* end = (unsigned char*)pBuffer + size; while (start < end) { if (*start < 0x80) // (10000000): 值小于0x80的为ASCII字符 { start++; } else if (*start < (0xC0)) // (11000000): 值介于0x80与0xC0之间的为无效UTF-8字符 { IsUTF8 = false; break; } else if (*start < (0xE0)) // (11100000): 此范围内为2字节UTF-8字符 { if (start >= end - 1) { break; } if ((start[1] & (0xC0)) != 0x80) { IsUTF8 = false; break; } start += 2; } else if (*start < (0xF0)) // (11110000): 此范围内为3字节UTF-8字符 { if (start >= end - 2) { break; } if ((start[1] & (0xC0)) != 0x80 || (start[2] & (0xC0)) != 0x80) { IsUTF8 = false; break; } start += 3; } else { IsUTF8 = false; break; } } return IsUTF8; } bool IsUTF8File(const char* pFileName) { FILE *f = NULL; fopen_s(&f, pFileName, "rb"); if (NULL == f) { return false; } fseek(f, 0, SEEK_END); long lSize = ftell(f); fseek(f, 0, SEEK_SET); //或rewind(f); char *pBuff = new char[lSize + 1]; memset(pBuff, 0, lSize + 1); fread(pBuff, lSize, 1, f); fclose(f); bool bIsUTF8 = IsUTF8Text(pBuff, lSize); delete[]pBuff; pBuff = NULL; return bIsUTF8; }
读取文件:
CString GetFile(CString filename, UINT CodePage) { CFile fileR; CString strFile = L""; if (!fileR.Open(filename, CFile::modeRead | CFile::typeBinary)) { return strFile; } BYTE head[3]; fileR.Read(head, 3); if (!(head[0] == 0xEF && head[1] == 0xBB && head[2] == 0xBF)) { fileR.SeekToBegin(); } ULONGLONG FileSize = fileR.GetLength(); char* pContent = (char*)calloc(FileSize + 1, sizeof(char)); fileR.Read(pContent, FileSize); fileR.Close(); int n = MultiByteToWideChar(CodePage, 0, pContent, FileSize + 1, NULL, 0); wchar_t* pWideChar = (wchar_t*)calloc(n + 1, sizeof(wchar_t)); MultiByteToWideChar(CodePage, 0, pContent, FileSize + 1, pWideChar, n); strFile = CString(pWideChar); free(pContent); free(pWideChar); return strFile; }
相关文章
- C++ explicit关键字
- ios开发,app调用资源文件到C++的方法
- ios开发,app调用资源文件到C++的方法
- C++ <windows.h>库函数探究初步:句柄操作
- C/C++每日一练(20230315)
- C/C++基础讲解(八十)之常见试题解答篇(矩阵逆置/删除指定的字符/括号匹配)
- C/C++基础讲解(六十二)之系统篇(显示目录内容/读取磁盘文件)
- Open3D (C++) 点云随机下采样到固定点数
- c++模板学习06之类模板与函数模板区别
- paip.c++ qt 目录遍历以及文件操作
- C++设计模式详解之模板模式解析
- C++ 静态调用C的DLL库(调用lib文件)
- 【华为OD机试 2023最新 】 区块链文件转储系统(C++ 100%)
- 解答私信@被c++折磨头秃的花季美少女 //C++ 利用指针数组输入10个单词,编写函数对10个单词进行排序并输出,要求判断是否有相同的单词,如果有相同的单词在输出时该单词只输出一次。
- C++实现解zip解压缩功能:将一个目录内的内容打包到zip文件以及将zip文件解压到某个目录(windows平台)
- C++使用ZLIB库进行文件解压缩(亲测可用)
- C++之技巧篇事件注册与发布
- C++:读写二进制文件到double数组,根据二进制数据量进行读取
- C++ open 打开文件(含打开模式一览表)
- C++之普通指针与智能指针相互转换(一百零六)
- VC++处理窗口的常用API函数及窗口处理经验总结(附源码)
- C++使用ShellExecute打开目标文件所在文件夹并选中目标文件
- C++ 反汇编:关于Switch语句的优化措施
- PAT 1095 Cars on Campus C++版
- 第一章 C++编程基础——1.7文件读写