今天要写一个csv文件,文件格式要求必须是unicode格式。然后我就用CStdioFile来写,但是发现写完了之后老是出现乱码的现象。后来终于解决了。
要点:
文件格式是需要写入一些东西来控制的,比如unicode需写入0xfffe标识
文件内容写入不能直接使用CStdioFile的WritString函数,需用write函数按二进制写入unicode字符
重要代码
CFileDialog dlg(FALSE, _T("csv"), _T("csv.csv"), OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT
, _T("csv文件(*.csv)|*.csv||"));
if (dlg.DoModal() != IDOK)
{
return;
}
CString strPath = dlg.GetPathName();
strPath = strPath.Left(strPath.ReverseFind('.')) + TEXT(".csv");//确保最后生成csv格式文件
CStdioFile clsFile;
if(!clsFile.Open(strPath,CFile::modeCreate|CFile::modeWrite|CFile::typeBinary))
{
AfxMessageBox(_T("文件创建失败!"));
return;
}
// CStdioFile写入UNICODE字符时,必须指定文件类型为UNICODE,或者在文件头写入0XFFFE。
// 写入 0xfffe
BYTE UH[] = {0xff, 0xfe};
clsFile.Write(UH, 2);
void WriteString( CStdioFile &clsFile, const TCHAR *str )
{
if(!str) return ;
#ifdef UNICODE
CString strTemp = str;
clsFile.Write(strTemp.GetBuffer(), strTemp.GetLength()*2);
#else
wchar_t *wideChar = NULL;
int needChar = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);
if (needChar > 0)
{
needChar += 1;
wideChar = new wchar_t[needChar];
ZeroMemory(wideChar, needChar*sizeof(wchar_t));
MultiByteToWideChar(CP_ACP, 0, str, -1, wideChar, needChar);
clsFile.Write(wideChar, needChar*sizeof(wchar_t));
delete[] wideChar;
}
#endif
}