Codeblocks的中文支持


這里以Code::Blocks 10.5版本為藍本進行說明。

首先,請在Code::Blocks里面輸入標准的一個C程序:

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<wchar.h>
  4. #include<string.h>
  5. #include<locale.h>
  6. int main(void)
  7. {
  8. char str[]="中國china";
  9. wchar_t str_w[]=L"中國china";
  10. int len=(int)strlen(str);
  11. int len_w=(int)wcslen(str_w);
  12. printf("%s,size=%d\n",str,len);
  13. setlocale(LC_ALL, "chs");
  14. wprintf(L"%s,size=%d\n",str_w,len_w);
  15. system("pause");
  16. return 0;
  17. }

然后選用不同的編譯器,觀看效果。

1.Tiny C

編譯沒問題,但是wprintf是顯示不出內容的。注釋掉setlocale(LC_ALL,"chs“)之后,wprintf顯示出和printf一樣的效果。

結果證明,Tinny C是不真正的支持wchar_t寬字符集。因為通過調試器,我發現他的wchar_t里面保存的字符每個字符確實是用2個字節了,但是里面編碼依然是ANSI編碼,並不是unicode代碼,所以setlocale(LC_ALL,"chs“)+wprintf顯示不出來(其實wprintf實現的時候,是不會直接輸出unicode的,他實際是先把unicode轉成多字節的ANSI編碼,然后再輸出,和printf原理一樣,就是多了一個轉碼過程,所以你使用之前必須先設置locale,否則他不知道如何轉,就輸不出來)。

雖然他自稱部分支持C99,但是至少在寬字符方面,支持的一點都不好。

Tinny C有一點好,他沒有亂碼,他要么不顯示,要么正常顯示。

2.VC2005-2010

一切OK,沒有亂碼。是支持wchar_t支持的最好的!

3.GCC(MinGW)

很遺憾,全是亂碼!和java 一個德行(相信用過Java的人一定會想起Java的亂碼解決花費的時間吧)。呵呵。但是GCC是支持wchar_t的,為什么會這樣?其實根本原因就是:本地化做的不好。

但是解決方法是有的。

要解決這個問題,先要搞清楚有三個地方涉及到編碼問題。

1.Code::Blocks 編輯器保存源文件用的編碼。

默認情況下,是保存為windows本地編碼的,也就是WINDOWS-936字符集,也就是GBK編碼。

但是很神奇的是,GCC編譯器默認編譯的時候是按照UTF-8解析的。你存成GBK,但是當成UTF-8解析,這還能編譯通過,這才有鬼了,所以這兩個地方編碼不統一好,編譯的時候報錯:error: converting to execution character set: Illegal byte sequence,你根本連通過編譯的可能性都沒有!

其實要解決這個問題很簡單,編寫Code::Blocks的人只需要在調用編譯器之前檢測一下源文件是什么編碼,然后就自動讓編譯器用什么編碼進行解釋,問題就解決了。只是很可惜,Code::Blocks編寫的人可能還沒有這么做,或許是對本地化認識不夠吧,也可能是覺得沒必要吧?(所以就給初學的人帶來問題了,所以就覺得易用性不如微軟了,免費和商業的東西還是有差距的。。。)

2。GCC編譯器編譯的時候對輸入的源文件解釋用的編碼

這個編譯器可以設置-finput-charset=charset來指定編譯器用什么編碼解釋輸入源文件。比如如果源文件的字符集是GBk,那么就必須指定-finput-charset=GBK,如果不指定,一律當做UTF-8處理。

除非你源文件真的是UTF-8,否則就會出現轉換錯誤。

3。編譯好的執行文件所用編碼

如果你1和2兩個地方的編碼都能統一,那么編譯時不會報錯了,但是編譯好了,運行一下看看,在控制台顯示的依然是亂碼!

那是因為控制台顯示的時候缺省的是使用系統默認的字符集,比如windows下用的是GBk,但是默認情況下,編譯之后的執行文件時編譯成UTF-8的,所以又出現了不統一,亂碼由此而生!

解決的方法和簡單,就是給編譯器加上選項:-fexec-charset=GBK,和windows默認的統一,就OK了。

搞懂了亂碼產生的原因,那么不難得出結論,如何修改,你想修改成什么都OK,關鍵是要統一,並不是像網上一些人說的,修改成GBK就OK,其實你要修改成UTF-8都OK,關鍵是統一。

下面說說修改的地方。

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,就統一了。

一切都那么簡單,其實,只是因為編程的人做的不夠完善,所以才會給使用的人帶來困擾。希望這篇文章能幫到一些初學者。或者遇到同樣問題的人。

總之,就是要源文件的編碼格式和編譯時選項的格式要一致。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM