剛開始使用Code::Blocks開發Windows中文應用程序的朋友們,如果在代碼中使用了中文字符串,編譯時可能遇到過Illegal byte sequence或Failure to convert GBK to UTF-8這樣的錯誤提示。這類錯誤的原因在於源代碼文件編碼和編譯器編碼設置不一致造成的。
- Code::Blocks 編輯器保存源文件用的編碼。
默認情況下,是保存為windows本地編碼的,也就是WINDOWS-936字符集,也就是GBK編碼。但是GCC編譯器默認編譯的時候是按照UTF-8解析的(linux默認字符集是UTF-8),如果沒有聲明編碼格式,編譯器會把GBK當成UTF-8解析,從而導致編譯錯誤。編譯時報錯:
error: converting to execution character set: Illegal byte sequence.
其實要解決這個問題很簡單,編寫Code::Blocks的人只需要在調用編譯器之前檢測一下源文件是什么編碼,然后就自動讓編譯器用什么編碼進行解釋,問題就解決了。只是很可惜,Code::Blocks編寫的人可能還沒有這么做,或許是對本地化認識不夠吧,也可能是覺得沒必要吧?(所以就給初學的人帶來問題了,所以就覺得易用性不如微軟了,免費和商業的東西還是有差距的。。。)
通常情況下,只要在Code::Blocks(13.12)中將源代碼文件保存為UTF-8格式,就可以消除上述錯誤。操作方法是在源代碼文件窗口激活的情況下,通過在編輯(Edit)菜單下的文件編碼(Encoding)子菜單中選擇BOM和UTF-8,然后保存並編譯源文件。
- GCC編譯器編譯的時候對輸入的源文件解釋用的編碼
GCC編譯器可以通過-finput-charset=charset設置來指定編譯器用什么編碼解釋輸入源文件。比如源文件的字符集是GBK,那么就必須指定-finput-charset=GBK,如果不指定,一律當做UTF-8處理,這時如果源文件編碼不是UTF-8,編譯時就會出現編碼轉換錯誤。
在Code::Blocks 13中也可以進入設置菜單打開編輯器設置對話框,在常規設置的“其它”頁面中修改這一編碼(如下圖)。
- 編譯可執行文件所用編碼
如果源代碼文件和編譯器輸入設置的編碼是一致的,編譯時就不會報錯了,但是編譯后運行時,在控制台顯示的依然是亂碼!
那是因為控制台顯示的時候缺省的是使用系統默認的字符集,比如windows下用的是GBK,但是默認情況下,編譯之后的執行文件時編譯成UTF-8的,所以又出現了不統一,亂碼由此而生!
要解決這一問題,需要在CodeBlocks的編譯器設置。進入設置菜單打開編譯器設置對話框,選擇編譯器設置的其它選項頁面(如下圖),添加選項:-fexec-charset=GBK。
重新編譯后,應用程序就可以正常運行了。
