CodeBlocks 输出汉字变乱码或问号, 编辑器与编译器的参数设置
算起来,使用 CodeBlocks 也有几年了,但对其了解只能算是皮毛,很多事情都是一知半解,没有搞清楚。
平时没遇到问题,也就没想去研究。
最近遇到一个很奇怪的问题,输出四个汉字其中一个变成问号。
黒白 单鞋 (注意:第一个汉字是 黒, 而不是黑)
其中,第一个汉字在输出的时候变成了问号,这什么情况,几年来还是第一次遇到。
下面,我简单的写了一个测试程序:
const char *pszText = "黒3"; printf("len:%d\n", strlen(pszText)); printf("pszText:'%s'\n", pszText);
输出的结果:
len:2
pszText:'?'
很明显,结果不符合预期。
我又测试了一下黑:
const char *pszText = "黑3"; printf("len:%d\n", strlen(pszText)); printf("pszText:'%s'\n", pszText);
输出的结果:
len:3
pszText:'黑3'
这又正常了,很明显,我当前的编程环境并不是所有的汉字在输出时都变成问号,并且这几年来我的程序在输出汉字的时候没遇到过这种问题,直到今天遇到这个汉字:黒
百度了一下后,找到这么几篇关于使用 CodeBlocks 中文变乱码的说明:
https://www.cnblogs.com/didiaodidiao/p/9189463.html
https://www.cnblogs.com/myfreedom614/archive/2012/04/10/2441173.html
根据上面链接的文章提示,以及我测试的情况来看,由于几年来我写了几个项目,由于源代码使用的是 windows-936,也不想再重新修改源代码的编码格式的情况下,适合我的 CodeBlocks 的配置环境应该是:
CodeBlocks 的【全局编译器设置】中,【其他编译器设置】中添加两行设置:
-finput-charset=gbk
-fexec-charset=gbk
---------------------------------------------------------------------
-finput-charset:用来指定输入源文件的的字符编码
-fexec-charset:输出的exe文件的字符编码集 (指定多字节字符串(const char *)常量在编译后的程序里保存的编码集)
注意:如果将 fexec-charset 设置为 utf-8,Linux 默认会认为执行环境是 utf-8,而 windows 下并不是,所以Linux下没问题,因为Linux就是 utf-8,但是 windows 下必然出现乱码。
---------------------------------------------------------------------
经过我的电脑测试:
-finput-charset=gbk
-fexec-charset=gbk
或
-finput-charset=windows-936
-fexec-charset=windows-936
效果都一样,都能解决正常输出 黒 这个汉字。
---------------------------------------------------------------------
后记:
如果从一开始,在我没有编写任何项目的情况下,我会把源代码编码默认使用 utf-8,那么 CodeBlocks 的配置环境应该是:
1. CodeBlocks 的编辑器设置中,【编码设置】应选择: utf-8,至于【设为默认的编码方式 (忽略 C::B 自动检测)】这一选项是否必须勾选,我不确定。
2. CodeBlocks 的【全局编译器设置】中,【其他编译器设置】中添加两行设置:
-finput-charset=utf-8
-fexec-charset=gbk
---------------------------------------------------------------------
-finput-charset:用来指定输入源文件的的字符编码
-fexec-charset:输出的exe文件的字符编码集 (指定多字节字符串(const char *)常量在编译后的程序里保存的编码集)
---------------------------------------------------------------------
---------------------------------------------------------------------
查看当前操作系统的代码页(Code Page):dos 下输入 chcp,可输出代码页信息。
关于代码页(Code Page)的详细介绍: https://www.cnblogs.com/benbenalin/p/6911781.html