在C++编程中,使用wcout输出宽字符时经常遇到以下问题:
- wcout完全不输出任何内容或者输出显示为问号或方框等乱码
- wcout和cout输出顺序混乱
根本原因
- wcout属于宽字符流,输出的是wchar_t宽字符(Windows下为2字节Unicode)
- cout属于窄字符流
- 两者拥有完全独立的输出缓冲区,默认情况下不同步
- 控制台默认不会翻译宽字符,导致直接丢弃或输出问号/方框
解决方案
方法一:开启中文宽字符支持
#include <iostream>
#include <locale>
int main() {
// 开启中文宽字符支持
setlocale(LC_ALL, "chs");
// 同步宽窄字符流缓冲区
std::ios_base::sync_with_stdio(true);
std::wcout << L"中文测试" << std::endl;
std::cout << "英文测试" << std::endl;
return 0;
}
方法二:C++17及之前版本
#include <iostream>
int main() {
std::cout << u8"中文测试 123abc" << std::endl;
return 0;
}
方法三:C++20及之后版本
#include <iostream>
int main() {
// C++20方式(超级难看)
std::cout << reinterpret_cast<const char*>(u8"中文测试 123abc") << std::endl;
return 0;
}
方法四:修改控制台代码页
#include <iostream>
#include <stdlib.h>
int main() {
// 设置控制台代码页为UTF-8
system("chcp 65001 > nul");
std::cout << "中文测试 123abc" << std::endl;
return 0;
}
方法五:使用Windows API
#include <iostream>
#include <windows.h>
int main() {
// 设置控制台输出代码页为UTF-8
SetConsoleOutputCP(CP_UTF8);
std::cout << "中文测试 123abc" << std::endl;
return 0;
}
总结与建议
建议不要轻易使用wcout,然后根据自己的编译器版本选择合适的方案,Linux/macOS 完全不用担心这些问题🤡

