C++_wcout / C_wprintf (wcout输出中文)
2015-09-18 12:09
459 查看
int _tmain(int argc, _TCHAR* argv[])
{
wcout.imbue(std::locale("chs"));
wstring s = (L"我爱");
wcout << s << endl;
wcout << L"我爱你" << endl;
system("pause");
return 0;
}
iostream、printf/wprintf和中文输出
使用C++标准库的iostream,可以方便地将控制台、文件、字符串以及其它可扩充的外部表示作为流来处理,但要处理中文,却会碰到很多问题。本 人原来没怎么用过这个iostream,这几天尝试用这个写点东西,一会儿不能输出中文,一会儿不支持中文文件名的,搞得头大。网上搜了搜,没有发现适用 于所有情况的解决方案。不过后来自己经过多次测试,基本解决了这些问题,现在写成文字作为一个总结,也供碰到同样问题的朋友参考。关于C语言中的 printf和wprintf的中文输出,本文也进行了探讨。
需要说明的是,我的开发环境是VS 2005(标准库当然也是微软实现的),不保证其它环境下是相同的效果。
1、cout和wcout
1、cout是用来输出char的,如果用cout输出wchar,只会输出地址,要使用wcout输出wchar。
2、wcout默认是不输出中文的,要想输出中文,要先加入setlocale( LC_ALL, "chs" );这行代码。
完整测试代码:
在缺省的C locale下,cout可以直接输出中文,但对于wcout却不行(至少VS 2005下不行)。对于wcout,需要将其locale设为本地语言才能输出中文:
wcout.imbue(locale(locale(),"",LC_CTYPE)); // ①
也有人用如下语句的,但这会改变wcout的所有locale设置,比如数字“1234”会输出为“1,234”。
wcout.imbue(locale(""));
2、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<<endl;
wofs<<L"Another test还是测试"<<1234<<endl;
3、printf和wprintf
加上这两位C语言中的老兄,问题更加复杂。考虑如下语句(注意s的大小写):
printf("%s", "multibyte中文/n"); // ④
printf("%S", L"unicode中文/n"); // ⑤
wprintf(L"%S", "multibyte中文/n"); // ⑥
wprintf(L"%s", L"unicode中文/n"); // ⑦
缺省情况下,⑤、⑦两条语句不能输出中文,这两条语句中字符串的形式是unicode形式的。如果在所有输出语句之前加上如下语句将C语言的全局locale设置为本地语言(C语言中只有全局locale)就可以正常输出了:
setlocale(LC_CTYPE, ""); // ⑧
但这会导致cout和wcout不能输出中文(汗,的确麻烦),将C语言的全局locale恢复后cout和wcout就正常了,如下所示:
setlocale(LC_CTYPE, "C"); // ⑨
但恢复后,printf和wprintf输出Unicode文本又不正常了(输出MultiByte文本总是正常的)。总不能每写一个 printf/wprintf就设置一次然后再恢复一次吧?所以,建议不要混用iostream和printf/wprintf,实在要混用,那就让 printf/wprintf只输出MultiByte字符串,这样不需要调用setlocale(),也就不会影响到cout和wcout。
总结
总之,用iostream、printf/wprintf输出中文,有点麻烦。概括起来要点如下:
如果要用wcout,需要在使用之前按语句①将其locale设置为本地语言;
如果要用ofstream或wofstream,要在打开文件之前按语句②将全局locale设为本地语言并保存初始的全局locale。然后在打开文件之后,按语句③将全局locale恢复为初始值;
不要混用iostream和printf/wprintf。如果要混用,只用printf/wprintf输出MultiByte字符串;
单独使用printf/wprintf时,如果要输出Unicode字符串,需要按语句⑧设置C语言的全局locale。如果只输出MultiByte字符串,则不需设置。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/wzcprince/archive/2009/07/11/4340699.aspx
{
wcout.imbue(std::locale("chs"));
wstring s = (L"我爱");
wcout << s << endl;
wcout << L"我爱你" << endl;
system("pause");
return 0;
}
iostream、printf/wprintf和中文输出
使用C++标准库的iostream,可以方便地将控制台、文件、字符串以及其它可扩充的外部表示作为流来处理,但要处理中文,却会碰到很多问题。本 人原来没怎么用过这个iostream,这几天尝试用这个写点东西,一会儿不能输出中文,一会儿不支持中文文件名的,搞得头大。网上搜了搜,没有发现适用 于所有情况的解决方案。不过后来自己经过多次测试,基本解决了这些问题,现在写成文字作为一个总结,也供碰到同样问题的朋友参考。关于C语言中的 printf和wprintf的中文输出,本文也进行了探讨。
需要说明的是,我的开发环境是VS 2005(标准库当然也是微软实现的),不保证其它环境下是相同的效果。
1、cout和wcout
1、cout是用来输出char的,如果用cout输出wchar,只会输出地址,要使用wcout输出wchar。
2、wcout默认是不输出中文的,要想输出中文,要先加入setlocale( LC_ALL, "chs" );这行代码。
完整测试代码:
// C++ #include <iostream> #include <locale> using namespace std; int main( void ) { locale loc( "chs" ); //locale loc( "Chinese-simplified" ); //locale loc( "ZHI" ); //locale loc( ".936" ); wcout.imbue( loc ); std::wcout << L"中国" << endl; return 0; }
在缺省的C locale下,cout可以直接输出中文,但对于wcout却不行(至少VS 2005下不行)。对于wcout,需要将其locale设为本地语言才能输出中文:
wcout.imbue(locale(locale(),"",LC_CTYPE)); // ①
也有人用如下语句的,但这会改变wcout的所有locale设置,比如数字“1234”会输出为“1,234”。
wcout.imbue(locale(""));
2、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<<endl;
wofs<<L"Another test还是测试"<<1234<<endl;
3、printf和wprintf
加上这两位C语言中的老兄,问题更加复杂。考虑如下语句(注意s的大小写):
printf("%s", "multibyte中文/n"); // ④
printf("%S", L"unicode中文/n"); // ⑤
wprintf(L"%S", "multibyte中文/n"); // ⑥
wprintf(L"%s", L"unicode中文/n"); // ⑦
缺省情况下,⑤、⑦两条语句不能输出中文,这两条语句中字符串的形式是unicode形式的。如果在所有输出语句之前加上如下语句将C语言的全局locale设置为本地语言(C语言中只有全局locale)就可以正常输出了:
setlocale(LC_CTYPE, ""); // ⑧
但这会导致cout和wcout不能输出中文(汗,的确麻烦),将C语言的全局locale恢复后cout和wcout就正常了,如下所示:
setlocale(LC_CTYPE, "C"); // ⑨
但恢复后,printf和wprintf输出Unicode文本又不正常了(输出MultiByte文本总是正常的)。总不能每写一个 printf/wprintf就设置一次然后再恢复一次吧?所以,建议不要混用iostream和printf/wprintf,实在要混用,那就让 printf/wprintf只输出MultiByte字符串,这样不需要调用setlocale(),也就不会影响到cout和wcout。
总结
总之,用iostream、printf/wprintf输出中文,有点麻烦。概括起来要点如下:
如果要用wcout,需要在使用之前按语句①将其locale设置为本地语言;
如果要用ofstream或wofstream,要在打开文件之前按语句②将全局locale设为本地语言并保存初始的全局locale。然后在打开文件之后,按语句③将全局locale恢复为初始值;
不要混用iostream和printf/wprintf。如果要混用,只用printf/wprintf输出MultiByte字符串;
单独使用printf/wprintf时,如果要输出Unicode字符串,需要按语句⑧设置C语言的全局locale。如果只输出MultiByte字符串,则不需设置。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/wzcprince/archive/2009/07/11/4340699.aspx
相关文章推荐
- C++ typename 总结
- Item 30:理解inline函数的里里外外 Effective C++笔记
- 【C语言】关于宏定义中#和##符号的使用和宏定义展开问题
- C语言的几个常见冷知识
- 彻底搞定C语言指针(转)
- 学生信息管理系统(C语言版)
- C语言程序设计经典书籍
- c++ 代理类与句柄类实现思想
- C语言之break和continue
- makefile---多个源文件,多个可执行文件(C/C++)
- C++如何调用C#编写的DLL
- makefile---单多个源文件,单个可执行文件(C/C++)
- C++封装、继承、多态
- C/C++__typedef用法
- c语言 conio.h头文件介绍
- 快速排序C++
- C语言中的getchar和putchar详解
- C/C++变量值交换的两种方式
- C语言结构体做参数易错情况分析
- c++ 类的对象与指针