Ubuntu 20.04下std::wcout输出wchar_t数据出现问号?问题
std::wcout输出非ASCII字符显示?的原因分析
- 区域设置默认值不支持非ASCII字符:C++程序启动时默认使用
C区域设置,该区域仅支持ASCII范围内的字符编码转换,你代码中L'\x00E7'对应的ç字符超出ASCII范围,默认配置下无法完成宽字符到终端多字节编码的转换,会被标准库替换为?输出。 - 宽字符输出的异常处理逻辑:
std::wcout输出宽字符时,会自动根据全局区域设置将宽字符转换为输出流对应的多字节编码,转换失败时默认不会抛出异常,也不会返回显式错误信息,因此你全程没有收到报错提示。 - 程序与终端编码不匹配:Ubuntu 20.04默认终端使用UTF-8编码,若程序没有主动配置匹配的区域设置,标准库无法识别终端的编码规则,就会出现非ASCII字符输出异常的问题。
修复方案验证
你可以在代码中引入<clocale>头文件,在main函数最开头添加如下代码即可解决问题:
setlocale(LC_ALL, "");
该行代码会将程序的全局区域设置切换为当前系统用户的默认区域设置(Ubuntu默认即为UTF-8编码的区域配置),匹配终端的编码规则后std::wcout就可以正常转换输出非ASCII宽字符。
内容的提问来源于stack exchange,提问作者ExZerminator
相关产品推荐
相关产品推荐

