问题描述
C&C++ 控制台程序 printf 函数输出中文和换行符 \n 显示异常。
#include <stdio.h>int main() {int choice;printf("菜单:\n");printf("1. 选项一\n");printf("2. 选项二\n");printf("3. 选项三\n");printf("4. 退出\n");printf("请选择一个选项 (1-4): ");scanf_s("%d", &choice);switch (choice) {case 1:printf("您选择了选项一\n");// 在这里执行选项一的代码break;case 2:printf("您选择了选项二\n");// 在这里执行选项二的代码break;case 3:printf("您选择了选项三\n");// 在这里执行选项三的代码break;case 4:printf("您选择了退出,程序结束。\n");return 0;default:printf("无效的选项。请重新输入 (1-4).\n");break;}return 0;
}
原因分析
UTF-8编码有两种形式:带签名的UTF-8和不带签名的UTF-8。“签名"实际上是一个叫做"字节顺序标记”(Byte Order Mark,BOM)的特殊字符,它的存在可以帮助识别文件的编码方式。
-
带签名的UTF-8文件以一个特殊的字符序列(EF BB BF)开始,这个字符序列就是UTF-8的BOM。它告诉文本编辑器或者其他读取文件的软件,这个文件是使用UTF-8编码的。
-
不带签名的UTF-8文件没有这个特殊的字符序列。因此,除非特别指定,否则文本编辑器或者其他读取文件的软件可能无法正确识别这个文件的编码方式。
源代码文件是使用不带签名的UTF-8编码的,因此编译器或者运行环境可能无法正确识别文件的编码方式,并且错误地将文件解析为了其他编码方式(例如ASCII或者ISO-8859-1),这可能导致换行符 \n
无法被正确解析。
解决方案
-
点击菜单栏
工具
,选择自定义
。 -
点击
命令
。
-
菜单栏选择
文件
,点击添加命令
。
4.类别选文件
,找到高级保存选项
,点确定
。
-
点击菜单栏
文件
,选择高级保存选项
,编码
选择UTF-8 带签名
。
-
保存文件,重新编译运行。中文和换行符正常显示。
将文件的编码方式改为带签名的UTF-8后,编译器或者运行环境可以通过BOM正确识别文件的编码方式,并且正确地解析换行符\n
,才能得到正确的输出。
参考资料
- https://blog.csdn.net/qq_41868108/article/details/105750175