# C++ wcout / C wprintf 输出中文相关各种问题 #include int main() { std::wcout.imbue(std::locale("chs")); wchar_t wsz[] = L"abcd霜之哀伤"; std::wcout<< wsz<< std::endl; system("pause"); return 0; } 转载自:http://blog.csdn.net/wzcprince/article/details/4340699 ## iostream、printf/wprintf和中文输出 使用C++标准库的iostream,可以方便地将控制台、文件、字符串以及其它可扩充的外部表示作为流来处理,但要处理中文,却会碰到很多问题。本人原来没怎么用过这个iostream,这几天尝试用这个写点东西,一会儿不能输出中文,一会儿不支持中文文件名的,搞得头大。网上搜了搜,没有发现适用于所有情况的解决方案。不过后来自己经过多次测试,基本解决了这些问题,现在写成文字作为一个总结,也供碰到同样问题的朋友参考。关于C语言中的 printf和wprintf的中文输出,本文也进行了探讨。 需要说明的是,我的开发环境是VS 2005(标准库当然也是微软实现的),不保证其它环境下是相同的效果。 ## cout和wcout 在缺省的C locale下,cout可以直接输出中文,但对于wcout却不行(至少VS 2005下不行)。对于wcout,需要将其locale设为本地语言才能输出中文: ``` wcout.imbue(locale(locale(),"",LC_CTYPE)); // ① ``` 也有人用如下语句的,但这会改变wcout的所有locale设置,比如数字“1234”会输出为“1,234”。 ``` wcout.imbue(locale("")); ``` ## ofstream和wofstream 在缺省的C locale下,ofstream能正确输出中文到文件中,但不支持中文文件名;wofstream支持中文文件名,但不能向文件中输出中文。要解决这个问题,需要在打开文件之前将全局locale设为本地语言。将全局locale设为本地语言后,ofstream和wofstream的问题都解决了,但 cout和wcout却不能输出中文了。要让cout和wcout输出中文,需要将全局locale恢复原来的设置,如下所示: ``` locale &loc=locale::global(locale(locale(),"",LC_CTYPE)); // ② ofstream ofs("ofs测试.txt"); wofstream wofs(L"wofs测试.txt"); locale::global(loc); // ③ ofs<<"test测试"<<1234<