算起來,使用 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