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