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

为何C语言中wprintf无法打印国际象棋Unicode字符♔(U+2654)?

问题:C语言中wprintf无法打印国际象棋Unicode字符♔(U+2654)

代码示例(main.c)

#include <wchar.h>
#include <locale.h>

int main()
{
    setlocale(LC_CTYPE, "");
    wchar_t piece = 0x2654;
    wprintf(L"HELLO (%lc)", piece);
    return 0;
}

实际输出

PS gcc -o main.exe -I include src/*.c ; ./main.exe
HELLO ()

预期输出

PS gcc -o main.exe -I include src/*.c ; ./main.exe
HELLO (♔)

运行环境

VS Code 中的 Windows Terminal(PowerShell)

已尝试的方法

  • 将终端字体更换为明确支持国际象棋字符的字体,问题依旧,但直接复制粘贴该字符到终端可正常显示。
  • 检查wchar_t大小:
    printf("%d", sizeof(wchar_t));
    // 输出:2(对应unsigned short)
    
  • 尝试多种打印方式:
    printf("♔"); /* 以及 */ printf("\u2654");
    // 输出:ÔÖö
    
    wprintf(L"\u2654");
    // 输出:无任何内容
    
    wprintf(L"♔");
    // 输出:无任何内容
    
    printf("\xE2\x99\x94");
    // 输出:ÔÖö
    
    wchar_t piece[] = L"♔";
    wprintf(L"HELLO (%ls)", piece);
    // 输出:HELLO ()
    

解决方案

核心原因

Windows 下的 MinGW/GCC 对宽字符输出存在兼容性问题:wprintf 无法正确将 UTF-16 宽字符转换为终端默认的 UTF-8 编码;同时setlocale(LC_CTYPE, "")在 Windows 下会设置系统默认 ANSI 编码而非 UTF-8,直接导致宽字符输出失败。

修复方法

方法1:直接输出UTF-8字节序列(推荐)

放弃宽字符函数,直接输出目标字符的UTF-8字节,同时确保终端编码为UTF-8:

#include <stdio.h>

int main()
{
    // 输出♔的UTF-8字节:0xE2 0x99 0x94
    printf("HELLO (%s)", "\xE2\x99\x94");
    return 0;
}

编译运行前,先在PowerShell中执行命令设置终端编码:

chcp 65001

方法2:强制设置UTF-8 locale

修改locale为UTF-8,配合宽字符函数使用:

#include <wchar.h>
#include <locale.h>

int main()
{
    // 强制设置UTF-8 locale
    setlocale(LC_CTYPE, ".UTF-8");
    wchar_t piece = 0x2654;
    wprintf(L"HELLO (%lc)", piece);
    return 0;
}

同样需要先执行chcp 65001设置终端编码,并确保字体支持该字符。

方法3:调用Windows原生API输出

绕过标准库,直接用Windows API写入控制台:

#include <windows.h>

int main()
{
    WCHAR str[] = L"HELLO (\u2654)";
    WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), str, lstrlenW(str), NULL, NULL);
    return 0;
}

该方法无需依赖locale设置,直接输出UTF-16字符,Windows Terminal可正确识别。


内容的提问来源于stack exchange,提问作者Blundergat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 04:32:49