要解決這個問題,先要搞清楚有三個地方涉及到編碼問題。
1.1CodeBlocks編輯器保存源文件用的編碼。
默認情況下,是保存為windows本地編碼的,也就是WINDOWS-936字符集,也就是GBK編碼。
但是很神奇的是,GCC編譯器默認編譯的時候是按照UTF-8解析的。你存成GBK,但是當成UTF-8解析,這還能編譯通過,這才有鬼了,所以這兩個地方編碼不統一好,編譯的時候報錯:error: converting to execution character set: Illegal byte sequence,你根本連通過編譯的可能性都沒有!
其實要解決這個問題很簡單,編寫Code::Blocks的人只需要在調用編譯器之前檢測一下源文件是什么編碼,然后就自動讓編譯器用什么編碼進行解釋,問題就解決了。只是很可惜,Code::Blocks編寫的人可能還沒有這么做,或許是對本地化認識不夠吧,也可能是覺得沒必要吧?(所以就給初學的人帶來問題了,所以就覺得易用性不如微軟了,免費和商業的東西還是有差距的)
1.2GCC編譯器編譯的時候對輸入的源文件解釋用的編碼
這個編譯器可以設置-finput-charset=charset來指定編譯器用什么編碼解釋輸入源文件。比如如果源文件的字符集是GBk,那么就必須指定-finput-charset=GBK,如果不指定,一律當做UTF-8處理。
除非你源文件真的是UTF-8,否則就會出現轉換錯誤。
1.3編譯好的執行文件所用編碼
如果你1和2兩個地方的編碼都能統一,那么編譯時不會報錯了,但是編譯好了,運行一下看看,在控制臺顯示的依然是亂碼!
那是因為控制臺顯示的時候缺省的是使用系統默認的字符集,比如windows下用的是GBk,但是默認情況下,編譯之后的執行文件時編譯成UTF-8的,所以又出現了不統一,亂碼由此而生!
解決的方法和簡單,就是給編譯器加上選項:-fexec-charset=GBK,和windows默認的統一,就OK了。
搞懂了亂碼產生的原因,那么不難得出結論,如何修改,你想修改成什么都OK,關鍵是要統一,并不是像網上一些人說的,修改成GBK就OK,其實你要修改成UTF-8都OK,關鍵是統一。
1.4修改的地方。
1.修改源文件保存編碼在:settings->Editor->gernal settings找到Encoding group Box
Use encoding when opening files:這個表示打開文件用的格式,第一次保存文件的時候也會用這個格式。
As default encoding:表示設置為文件缺省保存和打開編碼格式
注意,要先設置好,然后保存文件,才有效。如果你已經保存了文件,無論你怎么修改這個設置,也不會改變你文件的格式了。你的文件還是保持第一次保存的時候的格式。所以,如果遇到無法生效,只能先設置好格式,再重新建文件了。
2.修改編譯器對源文件解釋編碼格式和生成執行文件執行時候采用的編碼格式是在settings->compiler and debugger settings里面,選擇對應的GCC編譯器
在other options里面加入:
-finput-charset=charset
-fexec-charset=charset
第一個參數表示編譯的時候輸入文件的編碼解釋格式,第二參數表示生成的執行文件執行的時候顯示用的編碼格式。這些參數如果和實際不吻合,必然產生亂碼。只要吻合,就不會亂碼了。
由于我的源文件格式是WINDOWS-936,但是這里設置成UTF-8,所以編譯肯定報錯!
只需要修改成-finput-charset=WINDOWS-936或者GBk,就編譯通過了。
如果不設置fexec-charset默認會認為執行環境是UTF-8,而windows下并不是,所以Linux下沒問題,因為linux就是UTF-8的,但是windows下必然出現亂碼。所以設置成GBk,就統一了。
-
編碼
+關注
關注
6文章
935瀏覽量
54765 -
CodeBlocks
+關注
關注
0文章
24瀏覽量
9477
原文標題:codeblocks編碼問題
文章出處:【微信號:qrsworld,微信公眾號:嵌入式單片機】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論