[原]stl 输出unicode到文件中

在VS2008中,如果项目设置了unicode字符集,把中文输出到文件中经常会遇到错误。

在MFC项目中,可以使用以下语句来实现unicode到多字节字符的转换:

USES_CONVERSION;
CString strLog = _T("我爱大家");
const char*   cpLog   =   (const char*)W2A(strLog);
CFile myFile;
myFile.Open(_T("test.txt"),CFile::modeCreate|CFile::modeWrite);
myFile.Write(cpLog,strlen(cpLog));
myFile.Close();

其实stl也提供了unicode字符的处理,这里的unicode只是两个字节的字符(即unsigned short)。unicode对应的字符串处理比ansi麻烦,相关的类基本前面都带有’w’。如std::wstring,std::wofstream。

下面贴两段代码来实现输出unicode到文件中。

CString mfcstr = _T("大家.txt");
std::wstring   str   =   L"大家"; 
std::wofstream   ofile(mfcstr.GetBuffer(mfcstr.GetLength()));
ofile.imbue(std::locale("chs"));   ////设置输出流的imbue属性很重要
ofile.write(str.c_str(),str.length());
ofile.write(L"/r/n",2);
ofile.write(mfcstr.GetBuffer(mfcstr.GetLength()),mfcstr.GetLength());
ofile<<L"我爱她"<<endl;
ofile.close();  

要注意第四句,如果没有设置第四句,是不能把中文输出到文件中的。

2、设置全局的locale,输出中文到文件会出错,可能是因为没有设置好本地化的东西。

locale &loc=locale::global(locale(locale(),"",LC_CTYPE));
ofstream ofs("ofs.txt");
wofstream wofs(L"wofs测试.txt");
locale::global(loc);
ofs<<"test测试"<<1234<<endl;
wofs<<L"Another test还是测试"<<1234<<endl;

在读取这些文件时,首先要设置好locale,然后再打开文件来读取数据。如:

std::wstring   str   =   L"大家.txt"; 
wstring strLine;
locale loc("chs"); 
wifstream in;
in.imbue(loc);   //关键
in.open(str.c_str());
if (!in.is_open())
{
    AfxMessageBox(L"can't open the file");
    return ;
}
while (in>>strLine)
{
    CString mfcstr(strLine.c_str());
    AfxMessageBox(mfcstr);
}
in.close();