cdsfiui 发表于 2016-06-18 17:08

cout如何能正常的输出宽字符的字符串?


#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一样呢?

谢谢。

爻易 发表于 2016-06-18 18:00

这要看具体所用的控制台能接受的字符编码
#stty
speed 38400 baud; line = 0;
-brkint -imaxbel iutf8

控制台模拟器的种类很多,但大多都只接受utf8编码(控制台本身的设计已经很老了),有的模拟器则能支持gb18030编码。楼主若有能力自行设计控制台的话,可以有更高的自由度设计使用想要的任何编码。应用程序一般是把其它编码转换成控制台支持的编码后再输出。

爻易 发表于 2016-06-18 18:35

知道了这种转换关系,就可以看出wcout就是负责转换wchar_t类型的字符串的。有的中文串本身已经是控制台能接受的编码了,这样的中文串就直接可以cout输出,不必再作转换。
页: [1]
查看完整版本: cout如何能正常的输出宽字符的字符串?