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

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

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

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

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

具体可以参见http://blog.csdn.net/suhuaiqiang_janlay/article/details/5963867

问题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格式转换设置可以参考http://blog.csdn.net/li_tree_man/article/details/4634402

至于Ansi、Unicode、UTF8字符串之间的转换,请参考http://blog.csdn.net/iiprogram/article/details/3067720

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值