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