cout怎么样能正常的输出宽字符的字符串

C++语言 码拜 8年前 (2016-04-12) 1715次浏览
#include <iostream>
using namespace std;
int main()
{
    wcout << "abc" << endl;//wcout会把char自动转换成wchar_t再输出吗? 怎么样验证有没有转换?
    cout << "你好" << endl;//"你好"是多字节字符串,设置了中文代码页就可以显示。但为什么上面那个L"abc"不可以?
    cout << L"abc" << endl;//为什么cout不能输出宽字符? 是不是通过locale设置或代码页设置,能让cout输出多字节
    return 0;
}

如上面所示,
1. 第一个wcout能输出窄本人的字符串,是不是意味着wcout会自动把单字节的字符串,在内存里面转化成双字节的字符串,再输出?
2. 第二个cout输出多字节的中文没有问题。只要代码页设置正确就可以了。
3. 第三个cout输出总是乱码。为什么? cout能输出中文,都不能输出L开头的字符串吗? 能否通过什么设置来让它和wcout一样呢?
谢谢。

解决方案

40

#include <iostream>
using namespace std ;
int main () {
	std::wcout.imbue (std::locale ("chs")) ; //控制台的编码是跟随系统,所以wcout要求给出编码
	operator<< (cout ,"123\n") ; //我们一般使用的<<是cout的一个友元函数
	operator<< (wcout ,L"一二三\n") ;
	// operator<< (cout ,L"一二三\n") ; //没有这个定义
	operator<< (wcout ,"1一二三23\n") ; //输出12,可见它并不执行转换
	cout.operator<< ("123") << endl ; //最后这两个函数的参数类型是const void *
	wcout.operator<< (L"一二三") << endl ; //所以它们其实输出的是一个指针
	return 0 ;
}

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明cout怎么样能正常的输出宽字符的字符串
喜欢 (0)
[1034331897@qq.com]
分享 (0)