C++里Ofstream写文件的中文问题
2013-03-05 13:55
357 查看
说实话,这个问题很早就遇到,但是一直没有搜集比较完备的解决方法。这次把问题和解决方法都记录下来,以备来日查阅。
程序启动时默认设置为LC_ALL="C"。而要正确打开中文文件名的文件,需要设置为LC_ALL="chinese"。
具体可以参见/article/9317367.html
看上去要解决这2个办法,就要在打开文件的时候保证使用locale "C",而在写中文的时候保证使用locale "chinese"!
如果不想频繁的切换,那么最好的解决办法是把项目设置为UNICODE。以下代码可以顺利通过测试。
还有很关键的一点!注意这里的locale( "", locale::all ^ locale::numeric)!
“”表示表示使用本地语言,这里当然相当于“chs”或者“chinese”。
locale::all表示使用该语言的所有格式设置进行编码转换!
^是异或,locale::numeric表示数字格式。这里的意思是避免转换数字格式!否则123456输出结果会成为123,456这种形式!
更多的locale格式转换设置可以参考/article/11051582.html
至于Ansi、Unicode、UTF8字符串之间的转换,请参考/article/2564589.html
问题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
相关文章推荐
- C++里Ofstream写文件的中文问题
- [C++基础]cout与wcout,printf与wprintf,ofstream与wofstream关于输出中文的问题解决
- [C++基础]cout与wcout,printf与wprintf,ofstream与wofstream关于输出中文的问题解决
- 解决std::ofstream操作中文路径下文件的问题
- 解决std::ofstream操作中文路径下文件的问题
- C++读取写入.txt文件(ifstream/ofstream)—读取指定行,修改指定行,复制文件,清除文件,统计文件行数
- C++文件读写详解(ofstream,ifstream,fstream)
- C++文件读写详解(ofstream,ifstream,fstream)
- C++文件读写详解(ofstream,ifstream,fstream)
- 【转载】 C++文件读写详解(ofstream,ifstream,fstream)
- C++文件读写详解(ofstream,ifstream,fstream)
- C++文件读写详解(ofstream,ifstream,fstream)
- C++文件读写详解(ofstream,ifstream,fstream)
- C++文件读写详解(ofstream,ifstream,fstream)
- ifstream打开含中文路径文件时失败的问题
- c++里文件的输入输出ofstream和ifstream
- C++文件读写详解(ofstream,ifstream,fstream)
- ofstream和wofstream与中文输出问题
- C++文件读写详解(ofstream,ifstream,fstream)
- C++文件读写详解(ofstream,ifstream,fstream)