C++如何打印全部Unicode字符(或代码中使用的特殊字符)
C++输出Unicode字符解决方案
问题核心原因
- C++标准库流默认未配置和终端匹配的字符编码转换规则,宽字符流
std::wcout默认使用C locale,仅支持ASCII范围内的字符输出 - 部分平台(尤其是Windows)控制台默认编码不支持UTF-8,且可能缺少对应特殊字符的渲染字体
- 原代码注释标注使用UTF-8字符串字面量,但实际使用
L"前缀的宽字符字面量,二者实现逻辑不匹配
修复方案
方案1:优先使用UTF-8窄字符流(跨平台兼容性更好)
直接使用std::cout配合UTF-8字符串字面量,不需要处理复杂的宽字符转换逻辑,代码更简洁:
#include <iostream> #include <sstream> #include <string> // 仅Windows平台需要引入头文件 #ifdef _WIN32 #include <windows.h> #endif int main() { // Windows平台提前设置控制台输出编码为UTF-8 #ifdef _WIN32 SetConsoleOutputCP(CP_UTF8); // 可选:同步设置输入编码为UTF-8 SetConsoleCP(CP_UTF8); #endif std::stringstream instream; // 使用u8前缀标注UTF-8字符串字面量,C++20起可直接配合u8string使用 instream << u8"█\n \n▀\n▄\n▓\n"; std::cout << instream.rdbuf(); return 0; }
方案2:必须使用宽字符流的场景
需要先配置全局locale为系统默认本地化环境,让宽字符流可以正确完成编码转换:
#include <iostream> #include <sstream> #include <string> #include <clocale> // 仅Windows平台需要引入头文件 #ifdef _WIN32 #include <windows.h> #endif int main() { // 设置全局locale为系统当前默认locale,支持宽字符转码 setlocale(LC_ALL, ""); #ifdef _WIN32 // 禁用流同步避免Windows平台宽字符输出异常 std::wcout.sync_with_stdio(false); #endif std::wstringstream instream; instream << L"█\n \n▀\n▄\n▓\n"; std::wcout << instream.rdbuf(); return 0; }
额外注意事项
- 请确认你的终端使用的字体包含了你要输出的特殊字符的字形,否则即使编码正确也会显示为空白或方块占位符
- *Windows平台如果使用Visual Studio编译,请将源码文件保存为**UTF-8 带签名(BOM)*格式,避免编译器识别字符串字面量编码错误
内容的提问来源于stack exchange,提问作者Peter Nasonov
相关产品推荐
相关产品推荐

