You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 09:48:02