记录
在写C语言时,有时候需要使用printf输出中文,如果使用IDE来写代码,例如使用VisualStudio,输出中文没有问题。但是当使用编辑器+编译器的方式写代码,在这个环境下输出中文可能会遇到中文输出乱码。
环境
编辑器:VSCode
编译器:Mingw-w64
C语言代码:
#include <stdio.h>int main()
{char a[2048];FILE *fp;if ((fp = fopen("test.txt", "r+")) == NULL) {printf("无法打开\n");return 0;}fscanf(fp, "%s", &a);printf("a的值:%s\n", a); fclose(fp);return 0;
}
代码说明:上述代码的主要作用是读取文件的内容,并将读取内容输出在屏幕上
文件内容:
说明:test.txt 文件是通过右键新建文本文档建立的。
过程
1.编译:使用gcc main.c -o main,生成可执行文件main.exe
2.运行:输入main.exe 运行程序 (注:test.txt和C源文件在同一个文件夹下)
分析原因:
这时候输出中文异常,但是读取的内容没有问题。
这里关注两个:一是为什么"printf("a的值:%s\n", a)"这句代码中的汉字在输出时乱码,二是同样汉字,读取的内容没有问题。
第一个问题是因为编码不一致,也就是文件的编码和系统终端(也就是cmd)的默认编码是不一样的,中文系统里cmd的默认编码是GBK,而在VSCode中文件的编码是UTF-8。当这两个编码不一样时,会出现中文乱码,准确说是异常。
图:VSCode的文件默认编码是UTF-8
第二个问题为什么读取内容没问题呢,这是因为Windows文本文档的默认编码是ANSI(在中文系统里即GBK)(ANSI和ASCII的关系:简单说就是ANSI是对ASCII的扩展,兼容ASCII),cmd默认输出编码是ASCII(即GBK),所以读取了文件内容再将内容输出到cmd终端没有问题。
图:通过文件-另存为 可以查看到这个文件的编码方式,默认为ANSI
测试
知道后,可以做个测试,将test文件的编码改为UTF-8,然后再读取输出,如果没有错,这时候应该输出异常。
1.保存为UTF-8
2.运行下程序
和预想结果一样
拓展
这里使用另一个轻量IDE:Dev-C++
当把main.c用dev打开时,出现乱码:
这个乱码和上面终端输出“a的值”的乱码一样
做个测试,使用dev新建文件,复制代码进去
编译运行结果:
我们在dev的终端里"a的值"输出没有问题,后面的内容异常,这是因为前面把test文件改为了UTF-8。这里就要问一个问题dev的代码文件难道和cmd的编码格式一样?
可以使用notepad++查看文件编码:
这个demo.cpp是在dev里创建,编码是GB2312
前面用dev打开VSCode创建的main.c出现乱码,说明dev是以GB2312的编码方式打开文件的,也是以GB2312保存文件的,而GB2312编码在cmd里以GBK编码输出中文是没有问题的。
参考资料
python中文编码问题深入分析(二):print打印中文异常及显示乱码问题分析与解决