您的位置:首页 > 编程语言 > C语言/C++

C++里Ofstream写文件的中文问题

2013-03-05 13:55 357 查看
说实话,这个问题很早就遇到,但是一直没有搜集比较完备的解决方法。这次把问题和解决方法都记录下来,以备来日查阅。

问题1:中文路径问题导致文件打开失败。

通常是因为在调用fstream的open方法时,系统内部调用mbstowcs_s进行文件名转换,而mbstowcs_s依赖于程序的本地化设置(locale系列函数设置)。

程序启动时默认设置为LC_ALL="C"。而要正确打开中文文件名的文件,需要设置为LC_ALL="chinese"。

具体可以参见/article/9317367.html

问题2.无法输出中文。

这个原因刚好和问题1相反!在默认的C locale下wofstream无法输出中文!要输出中文,又得将LC_ALL设置回来!(即LC_ALL="C")

看上去要解决这2个办法,就要在打开文件的时候保证使用locale "C",而在写中文的时候保证使用locale "chinese"!

如果不想频繁的切换,那么最好的解决办法是把项目设置为UNICODE。以下代码可以顺利通过测试。

ofstream ofile("d://测试//测试.txt");
if(ofile.is_open())
{
ofile << 123456 << endl;//输出正确
ofile << "中文1" << endl;//输出成功
ofile << _T("中文2") << endl;//ofstream无法正确输出此处的Unicode字符串!
}
else
{
cout<<"Open Fail!";
}

wofstream wofile("d://测试//测试w.txt");
if(wofile.is_open())
{
wofile.imbue(locale( "", locale::all ^ locale::numeric));
wofile << 123456 << endl;//输出正确
wofile << "中文1" << endl;// wofstream无法正确输出此处的ansi字符串!
wofile << _T("中文2") << endl;//输出正确
}
else
{
cout<<"Open Fail!";
}


还有很关键的一点!注意这里的locale( "", locale::all ^ locale::numeric)!

“”表示表示使用本地语言,这里当然相当于“chs”或者“chinese”。

locale::all表示使用该语言的所有格式设置进行编码转换!

^是异或,locale::numeric表示数字格式。这里的意思是避免转换数字格式!否则123456输出结果会成为123,456这种形式!

更多的locale格式转换设置可以参考/article/11051582.html

至于Ansi、Unicode、UTF8字符串之间的转换,请参考/article/2564589.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: