code::blocks 初使用遇到的問題記錄


/*  做本程序遇到的問題:由於使用的是CODE::BLOCKS 開發環境,剛開始使用code::blocks是,什么都
沒有設置,居然輸入的中文字符串,保存項目后,再次打開,code::blocks不能正確識別源文件編碼,沒能識別
成:936中文代碼頁,而是 10** 什么的,打開后中文區域就是亂碼. 后來找到設置,發現是沒有強制指定用戶
需要的代碼頁所致,后來設置為強制就OK了,{不過,把源文件改成UTF8,來保存也是可以的(因為編輯器默認是UTF-8來打開),但是COUT<<"中華人民共和國"}
這樣的中文字符串時,控制台輸出為亂碼(編譯器又帶來了編碼不匹配),因為控制台默認不支持UTF8,或codeblock本地化做的不好的緣故,按道理
可以改控制台為chcp 65001是可以看到中文的,但codeblocks看不到.
只有指定編譯參數:-fexec-charset=GBK
-finput-charset=UTF-8
這樣就可以強制輸出的exe為GBK運行編碼而不是UTF運行編碼了.就可以正確顯示中文了,
如果還要搞Wchar_t的UNICODE 還需要setlocal(lc_all,"chs"),並且要么源文件是UTF-8,要么-finput-charset設置為GBK,否則編譯期就要報錯.........
//////////////////////////////////////////////////////////////////////////////////////////////////



網上查到的關於codeblocks編譯器,編碼的問題解釋:

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,關鍵是統一。

*/
#include <stdio.h>
#include <iostream>
#include <windows.h>
using namespace std;

///////////////////////////////////////////////////////////////////////////////
//最簡單的類模版
template <class M>
class A
{
    M ta;
public:
    A(M x):ta(x)  //這里很有特點,可以在構造函數的初始化表中初始化本類的成員變量.
    {
        ta=x;  //用這種方法也是一樣的,但可以認為不是初始化,而是賦值.
        //區別是:任何類型的const和引用數據成員必須在初始化表中初始化,
        //如果在構造函數內部進行初始化就會產生編譯時刻錯誤.
    }

    void print();
};

template <class M>
void A<M>::print()
{
    cout<<ta<<endl;
}
///////////////////////////////////////////////////////////////////////////////////




////////////////////////////////////////////////////////////////////////////////////
//測試普通類也是可以通過構造函數初始化表中初始化類成員變量.
class test
{
private:
    int a,b;
public:
    test(int x):a(x),b(x)
    {
       a=60;
       b=60;
    };

    void pr();

};

void test::pr()
{
    cout<<a<<"  "<<b<<"  "<<endl;
}


//////////////////////////////////////////////////////////////////////////////////////



int main()
{

   setlocale(LC_ALL,"chs");

   wchar_t a=L'';

    //printf("%d",(WORD)a);
    //printf("%d",HIBYTE(a));
    //printf("%d",LOBYTE(a));


       //wchar_t a=L'陳';
    //printf("%d\n",(WORD)a);
    //printf("%d\n",HIBYTE(a));
    //printf("%d\n",LOBYTE(a));

    char * b = "陳佑忠";
    cout<<b<<endl;
    MessageBoxA(0,b,b,0);
    wcout<<a<<endl;


    int m(',');
    cout<<m<<endl;

    test t(50);
    t.pr();


    A<float> ok(58.226);
    ok.print();

   return 0;
}

 


免責聲明!

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



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