MFC在Unicode字符集下读写文件

时间:2022-04-19 20:20:27
 MFC读取文件,在Unicode字符集下读写,读数据的时候出现错误 ,处以一堆乱码,读文件代码如下:
  
 

        CFile file(_T("E:\\1.txt"),CFile::modeRead); 
wchar_t *pBuf; 
DWORD dwFlielen;
dwFlielen=file.GetLength();
pBuf=new wchar_t[dwFlielen+1];
pBuf[dwFlielen]=0;
file.Read(pBuf,dwFlielen);
file.Close();
MessageBox(pBuf);
在Multi-Byte字符集下读写没有出错。请教高手

6 个解决方案

#1


把你那个文件另存为unicode试试

#3


检查 开头 2个 字节 
UNICODE 应该是  FF  FE (FF  FE UTF-16 aka UCS-2, little endian )
然后 逐个字节读入 到 buffer 遇到 0D (回车)时 就是 一行 (后面 3个 是 00 0A 00)
如果 不要 回车换行 这 4个 都 应该 =0;
然后 把 这行  变为 多 字节
WideCharToMultiByte
直到文件结束

#4


 试试:
// 先个修改区域设定
char* old_locale = _strdup( setlocale(LC_CTYPE,NULL) );
setlocale( LC_CTYPE, "chs" );//设定

//此处加入你读写文件代码

setlocale( LC_CTYPE, old_locale );
free( old_locale );//还原区域设定

#5


因为1.txt不是UNICODE编码的,所以不要用UNICODE的函数。


TRY
{
CFile file(_T("E:\\1.txt"),CFile::modeRead); 
CHAR *pBuf; 
DWORD dwFlielen;
dwFlielen=file.GetLength();
pBuf=new CHAR[dwFlielen+sizeof(CHAR)];
memset(pBuf, 0, dwFlielen+sizeof(CHAR));
file.Read(pBuf,dwFlielen);
file.Close();
MessageBoxA(NULL, pBuf, 0, 0);
}CATCH(CFileException, e)
{
e->ReportError();
}END_CATCH

#6


用二进制方式打开写入文件:
CStdioFile mFile;
CFileException fileException;
if(!mFile.Open(path,CFile::modeCreate|CFile::modeNoTruncate|CFile::modeWrite|CFile::typeBinary))
{
AfxMessageBox(_T("文件路径找不到,打开文件失败"));
return;
}
const int UNICODE_TXT_FLG = 0xFEFF; 
char d = '\t';
CString cs = _T("角度");
cs+=d;
cs+=_T("权值\r\n");

mFile.Write(&UNICODE_TXT_FLG,2);  
    mFile.Write(cs.GetBuffer(10),cs.GetLength()*2);

#1


把你那个文件另存为unicode试试

#2


#3


检查 开头 2个 字节 
UNICODE 应该是  FF  FE (FF  FE UTF-16 aka UCS-2, little endian )
然后 逐个字节读入 到 buffer 遇到 0D (回车)时 就是 一行 (后面 3个 是 00 0A 00)
如果 不要 回车换行 这 4个 都 应该 =0;
然后 把 这行  变为 多 字节
WideCharToMultiByte
直到文件结束

#4


 试试:
// 先个修改区域设定
char* old_locale = _strdup( setlocale(LC_CTYPE,NULL) );
setlocale( LC_CTYPE, "chs" );//设定

//此处加入你读写文件代码

setlocale( LC_CTYPE, old_locale );
free( old_locale );//还原区域设定

#5


因为1.txt不是UNICODE编码的,所以不要用UNICODE的函数。


TRY
{
CFile file(_T("E:\\1.txt"),CFile::modeRead); 
CHAR *pBuf; 
DWORD dwFlielen;
dwFlielen=file.GetLength();
pBuf=new CHAR[dwFlielen+sizeof(CHAR)];
memset(pBuf, 0, dwFlielen+sizeof(CHAR));
file.Read(pBuf,dwFlielen);
file.Close();
MessageBoxA(NULL, pBuf, 0, 0);
}CATCH(CFileException, e)
{
e->ReportError();
}END_CATCH

#6


用二进制方式打开写入文件:
CStdioFile mFile;
CFileException fileException;
if(!mFile.Open(path,CFile::modeCreate|CFile::modeNoTruncate|CFile::modeWrite|CFile::typeBinary))
{
AfxMessageBox(_T("文件路径找不到,打开文件失败"));
return;
}
const int UNICODE_TXT_FLG = 0xFEFF; 
char d = '\t';
CString cs = _T("角度");
cs+=d;
cs+=_T("权值\r\n");

mFile.Write(&UNICODE_TXT_FLG,2);  
    mFile.Write(cs.GetBuffer(10),cs.GetLength()*2);