1. 问题

今天使用codeblock时,编译的时候发现codeblock终端输出的中文出现了乱码。
看到codeblock右下角提示 “为了防止数据丢失,该文件已经保存为UTF-8”,然后就出现了乱码。

2.分析原因

在网上差了很多资料说:
乱码的原因是因为出现系统本地编码和codeblocks的编译器的解码方式是不一样的,是GBK编码方式和UTF-8编码方式的冲突问题。
一开始不是很明白,后来仔细地分析了一下。

有两种乱码:

  • 文件打开就是乱码
  • 终端输出乱码

文件打开就是乱码

如下:

    cout<<"±à¼­Æ÷£ºÉèÖÃΪÁËĬ"<<endl;
    cout<<"±àÒëÆ÷£ºÄ¬ÈÏ"<<endl;
    cout << "Hello world!" << endl;

这和编辑器的编码方式有关。
设置->编辑器->编码设置
在这里插入图片描述
我们发现这里有一个打开文件时,使用编码,它就是我们保存和打开文件时使用的编码格式:
我们常用的有两种编码方式:UTF-8 和 GBK
WINDOWS-936代表的是GBK编码格式,GBK是windows使用的编码格式;
UTF-8是codeblock默认的编码格式,UTF-8是Linux的编码格式。

题外话:
正是由于这两种格式的冲突在mingGW中提供了一套Windows下的基于GCC 程序开发环境,即在Windows平台上模拟了Linux下GCC的开发环境。

回归正题,windows系统下我们还是更常用WINDOWS-936编码格式,但是需要注意的是“使用此编码”一定要选择“设为默认的编码方式”,这样的话你保存和打开的文件编码格式就是一样的啦,打开文件就不会出现了乱码了。当然选择UTF-8也是可以的,就是后面的编译的编码方式也需要调整。
在这里插入图片描述

我之前选择的是“作为备用编码”,这压根就会导致codeblock先进行编码格式检测,检测不到再使用我们定义的编码格式。按理说是没问题的,但是不知道为什么我的codeblock应该自动将文件识别为UTF-8编码,即使文件是GBK的。GBK的文件,使用UTF-8解析打开当然就会出现上面的乱码了。

注意:文件的编码格式和他保存时codeblock的编辑器设定的格式是一样的,而且保存后就不能对编码格式进行修改了。

终端输出乱码

终端输出乱码和编译器有关:
设置->编译器
在这里插入图片描述
这里就需要两个命令:

-finput-charset=charset
-fexec-charset=charset

含义:

-finput-charset=charset指定编译器用什么编码解释输入源文件,它需要和源文件的编码格式一样,格式一样才可能编译;
如果格式不一样会报如下错误:
在这里插入图片描述
根本无法编译。
-finput-charset=charset的默认值是UTF-8;

-fexec-charset=charset是编译的时候以什么编码格式在终端输出.
-fexec-charset=charset默认情况下是UTF-8,但是windows不能识别,所以要修改为GBK,就不会出现乱码了。

3.总结

综上所述,codeblock有两种设置编码的格式:

(1)GBK-GBK-GBK

设置->编辑器->使用编码WINDOWS-936

设置->编译器->其他编译器设置
输入以下语句:

-finput-charset=GBK
-fexec-charset=GBK

在这里插入图片描述

(2)UTF-8 - UTF-8 - GBK

设置->编辑器->使用编码UTF-8
在这里插入图片描述
设置->编译器->其他编译器设置
输入以下语句:

-finput-charset=UTF-8
-fexec-charset=GBK

在这里插入图片描述

4.注意

两种格式的文件最好用相应的编码格式打开:
即 UTF-8 - UTF-8 - GBK 创建的文件就还用UTF-8 - UTF-8 - GBK配置打开,
GBK-GBK-GBK 创建的文件就还用GBK-GBK-GBK 配置打开。
否则可能会出现文件找不到,代码消失 的问题。

(我发现我的codeblock:
UTF-8 - UTF-8 - GBK 配置打开 GBK-GBK-GBK 文件没问题,可以显示代码内容;
GBK-GBK-GBK 配置打开UTF-8 - UTF-8 - GBK 文件就不会显示,当时吓坏我了
)

Logo

为武汉地区的开发者提供学习、交流和合作的平台。社区聚集了众多技术爱好者和专业人士,涵盖了多个领域,包括人工智能、大数据、云计算、区块链等。社区定期举办技术分享、培训和活动,为开发者提供更多的学习和交流机会。

更多推荐