==> 学习汇总(持续更新)
==> 从零搭建后端基础设施系列(一)-- 背景介绍


一般在windows上的txt文本文件要么以ANSI编码要么以Unicode编码,而用C ,C++,MFC编写的程序一般人只会处理一种编码格式的文本,因为不懂怎么判断读取的文件是以哪种编码格式存储的。那么重点就是判断读取的文件是以哪种方式存储的!有两种方式解决。

一.用二进制方式打开文件,前两个字节为FFFE就是Unicode文件,ANSI则无格式定义.
如图:
这是以16进制打开Unicode文件,很明显看到前两个字节是FFFE

再来,用C语言读取文件,如图:
把buf的地址在内存中显示出来,其内容是FFFE两个字节

因为编译器是32位的,所以最后显示如图:

所以现在基本确定判断Unicode的方法了.
例如:

int main(void)
{if (IsUnicode("H:\\Unicode.txt"))printf("打开的是Unicode文件\n");elseprintf("打开的是ANSI文件\n");return 0;
}

IsUnicode函数实现如下:

bool IsUnicode(char* fileName)
{FILE* fp = fopen(fileName, "rb");if (!fp){printf("打开文件失败!\n");return 1;}char buf[2] = { 0 };fread(buf, 1, 2, fp);char byte1[10] = { 0 };char byte2[10] = { 0 };sprintf(byte1, "%X", buf[0]);sprintf(byte2, "%X", buf[1]);int iLen1 = strlen(byte1);int iLen2 = strlen(byte2);if (byte1[iLen1 - 2] == 'F'&&byte1[iLen1 - 1] == 'F'&&byte2[iLen2 - 2] == 'F'&&byte2[iLen2 - 1] == 'E')return true;elsereturn false;fclose(fp);
}

判断完之后就是用相应的方法进行读写了,这样一个程序就能实现两种文件的读写。有兴趣的还可以判断UFT-8的。

二.用ANSI方式读写,如果读到Unicode的,就会出现乱码,并且截断,我试了很多,发现不管多大文件,都出来的长度都是10以下,所以根据这个性质,可以判断读出来的是哪种方式编码.但是记住,不能用Unicode方式读写来判断,因为它读出来的虽然是乱码,但是长度却是不确定的.

这里我用文件映射的方法读取,这个比较方便转换编码方式.直接上代码吧,也没有什么可以说的了。如果不懂文件映射的,可以看看前面的文章.

/*
@function    ReadFileOfMapping 以内存映射的方式读取文件
@param       strFileName       要读取的文件名称
@param       strContent        存放读取出来的内容
@return      TRUE OR FALSE     成功返回TRUE,失败返回FALSE
*/BOOL ReadFileOfMapping(_In_ const CString strFileName,_Out_ CString& strContent)
{BOOL bRet = FALSE;CStringA strA;do{//创建文件对象HANDLE hFile = ::CreateFile(strFileName, GENERIC_READ, FILE_SHARE_READ, 0,OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, 0);if (hFile == INVALID_HANDLE_VALUE){AfxMessageBox(TEXT("Open file faile!"));break;}//创建文件映射对象HANDLE hFileMapping = ::CreateFileMapping(hFile, 0, PAGE_READONLY, 0, 0, nullptr);if (!hFileMapping){AfxMessageBox(TEXT("Mapping faile!"));break;}//将文件的数据映射到进程的地址空间void* basepointer = ::MapViewOfFile(hFileMapping, FILE_MAP_READ, 0, 0, 0);if (!basepointer){AfxMessageBox(TEXT("View faile!"));CloseHandle(hFile);CloseHandle(hFileMapping);break;}//将进程空间的数据读到编辑框中strA = (char*)basepointer;strContent = strA;if (strContent.GetLength() < 10)    //如果是Unicode则把它转换为LPTSTRstrContent = (LPTSTR)basepointer;//从进程的地址空间撤销对文件数据的映射UnmapViewOfFile(basepointer);//关闭文件映射对象CloseHandle(hFileMapping);//关闭文件对象CloseHandle(hFile);} while (FALSE);return bRet;
}

这个函数自我觉得封装得还不错,可以直接用于各种场合.这个函数有两个版本其实,一个是MFC的CString版本和C++的string版本.

还有一个需要注意的问题就是,因为Unicode多了两个字节的标记,所以Unicode比ANSI多一个字(Unicode是双字节编码),就是文本头,有兴趣的可以去试试.

解决读取文件乱码问题相关推荐

  1. Go语言解决读取文件乱码

    1.当文件中存在中文字符时,读取文件出现乱码,解决方法: 使用"github.com/axgle/mahonia"第三方包解译码. package function import ...

  2. fopen php 乱码,如何解决php fgets读取文件乱码的问题

    如何解决php fgets读取文件乱码的问题,文件,乱码,简体中文,记事本,页面 如何解决php fgets读取文件乱码的问题 易采站长站,站长之家为您整理了如何解决php fgets读取文件乱码的问 ...

  3. 解决fileReader读取文件乱码

    解决fileReader读取文件乱码 idea默认编码格式是utf-8(标准万国码的一种),而Windows操作系统默认是GBK(中文码表),如果fileReader读取系统中的文件,则无法将字节转换 ...

  4. php加载的文件都是乱码_怎么解决php读取文件乱码问题

    php读取文件乱码的解决办法:首先打开相应的代码文件:然后通过"iconv($encodType, "utf-8", $content); "方法解决中文乱码即 ...

  5. 解决Mac文件乱码问题

    <一行shell解决Mac文件乱码问题>   使用Mac工作的小伙伴,经常面对一个问题就是,同事发来的一个文件是乱码的,尝试各种工具进行解码,如果文件少还好,文件多,几乎是崩溃的,所以本文 ...

  6. Linux解决txt文件乱码问题

    Linux解决txt文件乱码问题 出现原因:将windows中的txt文件拖到了linux中,双击打开或是使用cat等命令打开时会出现乱码现象 乱码原因:windows中字符串的编码格式为GBK,而L ...

  7. 解决IO流读取文件乱码问题

    读取文件时,出现乱码,文件是txt格式,编码格式默认为ANSI格式,即GBK 于是转为utf-8 InputStreamReader reader = new InputStreamReader( n ...

  8. Java笔记-解决读取文件时中文乱码问题(InputStreamReader设置编码)

    Java一般读取文件时使用如下代码: InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(&q ...

  9. python读取文件乱码问题

    今天突然想做一个实时读取 日志文件的程序,然后用Python爬虫直接爬取文件,用只读的方式打开避免对 系统 写入日志 造成影响. 上代码: #! /usr/bin/env python # codin ...

  10. 使用FPT上传下载文件和解决中文名文件乱码问题

    项目中从ftp服务器下载上传文件是一个经常用到的,下面是个人在用到的时候的一些学习记录. 为了方便,我在本地装了FileZilla Server,在本地搭建了一个ftp服务器. 先看一个简单的代码 i ...

最新文章

  1. [linux基础学习]文件和目录属性
  2. smarty学习——编程知识
  3. OSPF Router-ID的选择
  4. 简单的客户端,服务端通信
  5. python画完图 程序暂停运行_[Python实战]你也能写的计时器程序
  6. 检正email的格式
  7. 要重复多少次变成潜意识_新股要申购多少次才能保证一定中签?
  8. Android 4.3 新特性
  9. 数据库级别的MD5加密(建议收藏)
  10. 如何将mysql中的表传到elipse中_eclipse怎么连接到MySQL中的表!!!!!
  11. Scheme学习系列O:启动篇
  12. python pygame鼠标点击_Python之pygame学习鼠标操作(12)
  13. 2017年11月19日实验感想
  14. 数码管——8段共阴极数码管
  15. 程序员如何缓解自己内心的焦虑与烦躁
  16. PHP通过HTTP_USER_AGENT判断是否为手机移动终端的函数
  17. 微信转账记录删除了服务器还有吗,微信转账记录能彻底删除吗?你应该知道的删除技巧是这三种!...
  18. python爬虫第二弹-多线程爬取网站歌曲
  19. 数据挖掘(pandasxgboost)
  20. 慢SQL!压垮团队的最后一根稻草!

热门文章

  1. Ubuntu 关闭服务详解
  2. Bat脚本 -(一)- echo/ echo off/ echo on/ @ / start / pause / rem
  3. 系统分析师报名时间及入口
  4. python怎么下载网易云歌曲_python 下载网易云歌曲(能在线听都可以)
  5. (附源码)springboot球鞋商城 毕业设计 011229
  6. 针对前端项目选择不同的前端框架
  7. Kalibr标定工具箱使用详细过程
  8. Houdini11:材质
  9. (转载)SpringBoot配置Druid数据源监控服务Yml格式
  10. html字体样式(有中文兼英文实例)