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
相关产品推荐
相关产品推荐

