http://topic.csdn.net/u/20091207/12/2379a9e4-2f92-4f3e-9db5-59e5f656f78f.html
在看了这个论坛后,我也想尝试一下,如何把Unicode中文写到txt文件中。
首先请看这篇字符转码的文章:http://blog.csdn.net/zhoujielunzhimi/article/details/8082286
很明显,我可以轻易的把CStringW转换成char*然后写入txt(不用担心中文会变成乱码),但是我没有这么做。
因为解决问题的方法太多了,我们总是想着最简单的那一种。
首先,地区语言设置很重要。
#include <locale.h>
_wsetlocale(LC_ALL,L"chs"); //设置成中文
其次,(与上面论坛的方法有些差别,因为我不是在MFC中,而是在WTL中,这就要求尽量不用MFC dll,因此我放弃了CStdioFile,这个类只支持char*)
所以我选择了最原始的C的方法(也许C++中也有与fstream对应的unicode版本,的确是有的wofstream,但是很遗憾,这个函数在遇到中文时就停止继续输出后面的文字了)
// 日志文件,写入unicode中文
class LogFile
{
public:
LogFile()
{
fp = NULL;
}
bool Open(const char* path)
{
fopen_s(&fp,path,"a+"); //以追加方式写入,文件不存在时,会自动创建
if(fp == NULL)
{
perror("fopen_s a+ : ");
return false;
}
return true;
}
bool WriteString(CStringW str)
{
UStrToWChar wchar(str); //这个是将CStringW转换成wchar_t*,因为我不放心GetBuffer函数。这个类在上面提到的文章中可以看到
int len = wcslen(&wchar); //求出宽字符个数
int n = fwprintf_s(fp,L"%s",&wchar); //这个函数就是用来写宽字符的
if(n == len)
return true;
else
{
perror("fwprintf_s : ");
Close();
return false;
}
}
void Close()
{
if(fp != NULL)
{
fclose(fp);
fp = NULL;
}
}
private:
FILE* fp;
};
测试代码:
LogFile file;
if(file.Open("log.txt"))
{
CStringW str = L"This is 中文 words test \r\n";
CStringW str2 = L"More Words 中文ING";
bool need_close = false;
if(file.WriteString(str))
{
if(file.WriteString(str2))
need_close = true;
}
if(need_close)
file.Close();
}
程序结果图: