Windows 11下C语言终端无法打印Emoji的问题求助
Windows终端C语言输出Emoji乱码问题解决
问题原因
- 终端编码不匹配:Windows 11默认终端(CMD/PowerShell)使用GBK编码,而代码输出的是UTF-8编码的Emoji,编码不一致导致乱码。
- C标准库输出编码默认值:Windows下
printf默认采用系统本地编码(GBK)输出,不会自动适配UTF-8。 - 安全隐患:代码中使用的
gets函数无缓冲区长度检查,极易造成缓冲区溢出,属于不安全函数。
解决方法
方法1:切换终端编码为UTF-8
- 临时切换:打开终端后执行命令
chcp 65001,再运行编译后的程序。 - 永久设置:打开Windows设置→「时间和语言」→「语言和区域」→「管理语言设置」→「更改系统区域设置」,勾选「Beta版:使用Unicode UTF-8提供全球语言支持」,重启系统后终端默认编码即为UTF-8。
方法2:代码中强制设置输出流为UTF-8
调用Windows API强制控制台输出使用UTF-8,无需手动修改终端设置:
#include <windows.h> // 新增头文件 int main() { SetConsoleOutputCP(CP_UTF8); // 设置控制台输出编码为UTF-8 // 后续原有代码... }
方法3:替换不安全的gets函数
用fgets替代gets,同时处理换行符问题:
do { printf("Enter ur message: "); fgets(message, sizeof(message), stdin); message[strcspn(message, "\n")] = '\0'; // 移除fgets读取到的换行符 } while(strlen(message) <= 0 || strlen(message) >= 10);
改进后的完整代码
#include<stdio.h> #include<string.h> #include<windows.h> // 新增头文件 void print_bulb(int bit); int main() { SetConsoleOutputCP(CP_UTF8); // 设置控制台输出UTF-8 char message[10]; do { printf("Enter ur message: "); fgets(message, sizeof(message), stdin); message[strcspn(message, "\n")] = '\0'; // 去除换行符 } while(strlen(message) <= 0 || strlen(message) >= 10); for (int i = 0; i < strlen(message); i++) { int decimal = message[i]; int binary[] = {0,0,0,0,0,0,0,0}; for (int j = 0; j <= 7; j++) { binary[j] = decimal % 2; decimal = decimal/2; } for (int k = 7; k >= 0; k--) { print_bulb(binary[k]); } printf("\n"); } } void print_bulb(int bit) { if (bit == 0) { printf("\U000026AB"); } else if (bit == 1) { printf("\U0001F7E1"); } }
内容的提问来源于stack exchange,提问作者DinoGoWoof
相关产品推荐
相关产品推荐

