注册 登录
编程论坛 C语言论坛

求助:wcout无输出

追梦人zmrghy 发布于 2022-12-09 14:47, 810 次点击
cout输出正常,同样的程序换成wcout无输出。
DEBUG添加断点,观察wstring字符串正确,就是wcout无输出。
记得好像以前遇到过这个问题。
查找以前发的帖子,找到了解决方法。
添加一句std::wcout.imbue( std::locale(std::locale(),"",std::locale::ctype) );
wcout就可以正常输出了。。。。
但也只能是照猫画虎,不知其意。。。。

求教:std::wcout.imbue( std::locale(std::locale(),"",std::locale::ctype) ); 是什么意思。。。。


只有本站会员才能查看附件,请 登录

只有本站会员才能查看附件,请 登录

只有本站会员才能查看附件,请 登录

只有本站会员才能查看附件,请 登录


1 回复
#2
rjsp2022-12-09 16:56
不知道的话,也没关系,反正也几乎碰不到它(gcc就只同意设置global locale)

首先是 locale 的概念,这个概念比较失败,所以很少人谈论它,略。
std::locale() 它获得当前使用的global locale,而默认当然是从C语言继承过来的"C"。(C语言的setlocale函数就有两个特殊参数,"C" 和 "",其中""表示系统本身的本地环境)
std::locale(std::locale(),"",std::locale::ctype) 是创建一个locale实例,这个实例从std::locale() --- 也就是 global locale --- 继承而来,除了 std::locale::ctype(字符分类特征) 来自于名为""的locale --- 也就是系统本身的本地环境
简而言之,std::locale(std::locale(),"",std::locale::ctype) 就是创建了一个「其它不变,除了字符分类特征改为系统本身环境」的本地环境

其次,wcout为什么需要imbue?这又是一个历史遗留的发育不良,同样略。(甚至wcout本身都出生太早了)
wcout.imbue 的作用是告知怎么将 wchar_t[] 转换成系统输出需要的字符编码。
1