编辑器写C语言输出中文乱码问题及解决

 更新时间:2023年09月08日 16:55:18   作者:是严寒呀  
这篇文章主要介绍了编辑器写C语言输出中文乱码问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

编辑器写C语言输出中文乱码

在写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编码输出中文是没有问题的。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • C++模板实现顺序栈

    C++模板实现顺序栈

    这篇文章主要为大家详细介绍了C++模板实现顺序栈,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • C语言递归函数与汉诺塔问题简明理解

    C语言递归函数与汉诺塔问题简明理解

    递归(recursive)函数是“自己调用自己”的函数,无论是采用直接或间接调用方式。间接递归意味着函数调用另一个函数(然后可能又调用第三个函数等),最后又调用第一个函数。因为函数不可以一直不停地调用自己,所以递归函数一定具备结束条件
    2022-07-07
  • C++实现推箱子小游戏

    C++实现推箱子小游戏

    这篇文章主要为大家详细介绍了C++实现推箱子小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-01-01
  • C++变量存储的生命周期与作用域实例代码精讲

    C++变量存储的生命周期与作用域实例代码精讲

    这篇文章主要介绍了C++变量存储的生命周期与作用域,从创建到消亡的完整过程,例如人从出生到死亡的整个过程就是一个生命周期。本文将通过示例为大家详细讲讲,感兴趣的可以学习一下
    2022-10-10
  • C语言编程基础char类型转换示例

    C语言编程基础char类型转换示例

    这篇文章主要为大家介绍了C语言编程基础char类型转换示例代码,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • C++编程中的格式化输出详解

    C++编程中的格式化输出详解

    这篇文章主要介绍了C++编程中的格式化输出详解,是C++入门学习中的基础知识,需要的朋友可以参考下
    2015-09-09
  • C语言实现实验设备管理系统

    C语言实现实验设备管理系统

    这篇文章主要为大家详细介绍了C语言实现实验设备管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • C++ explicit关键字的使用详解

    C++ explicit关键字的使用详解

    这篇文章主要介绍了C++ explicit关键字的使用详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-09-09
  • vscode+platformIO开发stm32f4的实现

    vscode+platformIO开发stm32f4的实现

    这篇文章主要介绍了vscode+platformIO开发stm32f4的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05
  • 一篇文章教你如何用C语言实现strcpy和strlen

    一篇文章教你如何用C语言实现strcpy和strlen

    这篇文章主要为大家介绍了C语言实现strcpy和strlen的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-01-01

最新评论