问题背景
在项目中遇到需要将一个Unicode编码(UTF-16 LE)的文件内容解析出来,但是在使用MFC的类CStdioFile进行文件读取的时候,出现乱码。
同时,读取的文件有可能还是ASCII编码的,使用CStdioFile读取是可以正常读取。需要同时兼容两个编码。
问题分析
1、Unicode编码的文件其文件前两个字节是0xEF FF,可以以此来判定文件编码格式。
2、将文件以字节流的方式读取出来后,使用MultiBytesToWideChar可以转换成可见字符串。
解决方案
1、既然CStdioFile可以处理ASCII编码,那么可以派生一个类CMyStdioFile专门用于处理Unicode编码。即:CStdioFile处理ASCII编码,CMyStdioFile处理Unicode编码。
2、在打开文件的时候顺便将文件编码判定出来,保存在类成员中,后面使用
代码
#pragma once
#include "afx.h"
#include <string>
//用来处理Unicode格式的FORM文件读取
class CMyStdioFile :
public CStdioFile
{
public:
CMyStdioFile();
virtual ~CMyStdioFile();
public:
//打开文件,内部会判断文件是Unicode还是ASCII
virtual BOOL Open(LPCTSTR lpszFileName, UINT nOpenFlags, CFileException* pError = NULL);
//读取下一行的数据,可以支持Unicode文件和ASCII文件
virtual BOOL ReadString(CString& rString);
private:
<