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

C语言中如何使用printf打印实心/空心方块字符?

问题根因

printf("%c", (char)254u); 无法输出目标字符的核心原因是:数值254是早期DOS系统OEM代码页(如CP437)下的实心方块映射值,这套编码规则早已停止通用。当前主流环境中,Windows默认控制台编码为GBK、Linux/macOS全局默认使用UTF-8,单字节254既不对应两个方块字符在当前编码下的取值,还可能因为char默认是有符号类型导致数值溢出,最终输出乱码。

可行实现方案

全平台通用方案(推荐)

所有现代操作系统都原生支持UTF-8编码,直接输出两个方块字符对应的UTF-8序列即可,兼容性最高。

  • 如果你的开发环境支持源码保存为UTF-8格式,可以直接在代码中写入字符:
#include <stdio.h>

int main() {
    printf("空心方块:□\n");
    printf("实心方块:■\n");
    return 0;
}
  • 如果需要规避源码编码带来的兼容问题,可以直接硬编码两个字符的UTF-8转义序列,不依赖源码文件编码:
#include <stdio.h>

int main() {
    // 空心方块□ 对应Unicode码点U+25A1,UTF-8字节序列为0xE2 0x96 0xA1
    printf("空心方块:\xE2\x96\xA1\n");
    // 实心方块■ 对应Unicode码点U+25A0,UTF-8字节序列为0xE2 0x96 0xA0
    printf("实心方块:\xE2\x96\xA0\n");
    return 0;
}

Windows平台专属适配

旧版本Windows控制台默认使用GBK(代码页936)编码,直接输出UTF-8字符可能乱码,可以在程序初始化时将控制台输出代码页切换为UTF-8,再执行输出:

#include <stdio.h>
#include <windows.h>

int main() {
    // 65001是UTF-8对应的Windows代码页编号
    SetConsoleOutputCP(65001);
    printf("空心方块:□\n");
    printf("实心方块:■\n");
    return 0;
}

注意:不要尝试通过传入0-255范围的单字节数值打印特殊符号,单字节编码的字符映射和系统当前代码页强绑定,跨环境运行必然出现乱码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 20:27:19