vc 文字轉換到機內碼,輸入漢字和數字, 輸出一串16進制碼(數字-〉ASII碼,漢字—〉國標碼)


    // 可以用,此程序實現的是是文字轉換到機內碼。機內碼=國標碼+8080H,不過學習了。

    //此程序是利用漢字在機器內輸出就是機內碼的原理,直接保存的,其實挺簡單.
    //輸入一串漢字和數字的混合字符, 經過程序轉換, 對應輸出一串16進制碼(數字-〉ASII碼,漢字—〉國標碼)
    CString temp;
    GetDlgItemText(IDC_EDIT1,m_hanzi);//將漢字保存到變量m_hanzi

    unsigned char *b=new unsigned char[m_hanzi.GetLength()+1];//新建無符號字符 數組,賦值給無符號字符指針b 

    memcpy(b,m_hanzi,m_hanzi.GetLength());//m_hanzi中的漢字字符  復制到字符指針b中(內存中)

    for(int i=0;i<m_hanzi.GetLength();i++) //一個字符一個字符進行轉換  ( 漢字的長度 )
    {
        m_shuzi.Format(" %x", b[i]);//內存中的機器碼字符用十六進制顯示
        temp=temp+m_shuzi;//文本框中顯示
    }

    m_shu.SetWindowText(temp);//
    delete(b);//刪除字符指針b 

 

vc/c++中的英文字符仍然采用ASCII編碼方式。可以設想,其他國家程序員利用vc/c++編寫程序輸入本國字符時,vc/c++則會采用該國的字符編碼方式來處理這些字符。

我個人猜測,vc安裝程序中應該帶有不同國家的內碼庫,這樣一來肯定會占用很大的空間。

2.VC中漢字的編碼方式

vc/c++正是采用了GB2312內部碼作為漢字的編碼方式,因此vc/c++中的各種輸入輸出方法,如cin/wcin,cout /wcout,scanf/wsanf,printf/wprintf...都是基於GB2312的,如果漢字的內碼不是這種編碼方式,那么利用上述各種 方法就不會正確的解析漢字。

可以用下面的Demo程序來模擬vc/c++中輸出漢字字符的過程。

 

 unsigned char input[50];

cin>>input;

    int flag=0;

    for(int i =0 ;i < 50 ;i++)

    {

       if(input[i] > 0xa0 && input[i] != 0)

       {

           if(flag == 1)

           {

              cout<<"chinese character"<<endl;

              flag = 0;

           }

           else

           {

              flag++;

           }

       }

       else if(input[i] == 0)

       {

           break;

       }

       else

       {

           cout<<"english character"<<endl;

       }

}

 

 

 

輸入:Hello中國 (“中國”對應的GB2312內碼為:214 208,185 250)

輸出:english character

english character

english character

english character

english character

chinese character

chinese character

Java與C#語言都是采用Unicode編碼方式,在這兩種語言中定義一個字符,在內存中存放的就是這個字符的兩字節Unicode碼。如下所示:

char a='我';    => 內存中存放的Unicode碼為:25105

----

上面unsigned char input[50] ,這屬於聲明了Unicode編碼格式,所以你后面的那句話“問題又產生了”,沒有任何意義。我個人的看法

 

VC中的漢字編碼

轉載自:http://m.blog.csdn.net/blog/wwxl1986622/7227266

vc/c++中的英文字符仍然采用ASCII編碼方式。可以設想,其他國家程序員利用vc/c++編寫程序輸入本國字符時,vc/c++則會采用該國的字符編碼方式來處理這些字符。

我個人猜測,vc安裝程序中應該帶有不同國家的內碼庫,這樣一來肯定會占用很大的空間。

二 解決引入問題所需的知識

   主要需兩方面的知識,第一個為字符尤其是漢字的編碼,以及語言和工具的支持情況,第二個是vc/c++中MutiByte Charater Set 和 Wide Character Set有關內存分配的情況。

三 漢字的編碼方式及在vc/c++中的處理

1.漢字編碼方式的介紹

對英文字符的處理,7位ASCII碼字符集中的字符即可滿足使用需求,且英文字符在計算機上的輸入及輸出也非常簡單,因此,英文字符的輸入、存儲、內部處理和輸出都可以只用同一個編碼(如ASCII碼)。

而漢字是一種象形文字,字數極多(現代漢字中僅常用字就有六、七千個,總字數高達5萬個以上),且字形復雜,每一個漢字都有"音、形、義"三要素, 同音字、異體字也很多,這些都給漢字的的計算機處理帶來了很大的困難。要在計算機中處理漢字,必須解決以下幾個問題:首先是漢字的輸入,即如何把結構復雜 的方塊漢字輸入到計算機中去,這是漢字處理的關鍵;其次,漢字在計算機內如何表示和存儲?如何與西文兼容?最后,如何將漢字的處理結果從計算機內輸出?

為此,必須將漢字代碼化,即對漢字進行編碼。對應於上述漢字處理過程中的輸入、內部處理及輸出這三個主要環節,每一個漢字的編碼都包括輸入碼、交換碼、內部碼和字形碼。在計算機的漢字信息處理系統中,處理漢字時要進行如下的代碼轉換:輸入碼→交換碼→內部碼→字形碼。

(1)輸入碼: 作用是,利用它和現有的標准西文鍵盤結合來輸入漢字。輸入碼也稱為外碼。主要歸為四類:

a)      數字編碼:數字編碼是用等長的數字串為漢字逐一編號,以這個編號作為漢字的輸入碼。例如,區位碼、電報碼等都屬於數字編碼。

b)      拼音碼:拼音碼是以漢字的讀音為基礎的輸入辦法。

c)      字形碼:字形碼是以漢字的字形結構為基礎的輸入編碼。例如,五筆字型碼(王碼)。

d)      音形碼:音形碼是兼顧漢字的讀音和字形的輸入編碼。

(2)交換碼:用於漢字外碼和內部碼的交換。交換碼的國家標准代號為GB2312-80。

(3)內部碼:內部碼是漢字在計算機內的基本表示形式,是計算機對漢字進行識別、存儲、處理和傳輸所用的編碼。內部碼也是雙字節編碼,將國標碼兩個字節的最高位都置為"1",即轉換成漢字的內部碼。

(4)字形碼:字形碼是表示漢字字形信息(漢字的結構、形狀、筆划等)的編碼,用來實現計算機對漢字的輸出(顯示、打印)。

2.VC中漢字的編碼方式

vc/c++正是采用了GB2312內部碼作為漢字的編碼方式,因此vc/c++中的各種輸入輸出方法,如cin/wcin,cout /wcout,scanf/wsanf,printf/wprintf...都是基於GB2312的,如果漢字的內碼不是這種編碼方式,那么利用上述各種 方法就不會正確的解析漢字。

仔細觀察ASCII字符表,從第161個字符開始,后面的字符並不經常為用戶所使用,負值也未使用。GB2312編碼方式充分利用這一特性,將 161-255(-95~-1)之間的數值空間作為漢字的標識碼。既然255-161 = 94不能滿足漢字容量的要求,就將每兩個字符並在一塊(即一個漢字占兩個字節),顯然,94* 94 =8836基本上已經滿足了常用漢字個數的要求。計算機處理字符時,當連續處理到兩個大與160(或-95~-1)的字節時,就認為這兩個字節存放了一個 漢字字符。可以用下面的Demo程序來模擬vc/c++中輸出漢字字符的過程。

   unsigned char input[50];

cin>>input;

    int flag=0;

    for(int i =0 ;i < 50 ;i++)

    {

       if(input[i] > 0xa0 && input[i] != 0)

       {

           if(flag == 1)

           {

              cout<<"chinese character"<<endl;

              flag = 0;

           }

           else

           {

              flag++;

           }

       }

       else if(input[i] == 0)

       {

           break;

       }

       else

       {

           cout<<"english character"<<endl;

       }

}

輸入:Hello中國 (“中國”對應的GB2312內碼為:214 208,185 250)

輸出:english character

english character

english character

english character

english character

chinese character

chinese character

3.新的內碼標准---Unicode

Unicode(統一碼、萬國碼、單一碼)是一種在計算機上使用的字符編碼。它為每種語言中的每個字符設定了統一並且唯一的二進制編碼,以滿足跨語 言、跨平台進行文本轉換、處理的要求。1990年開始研發,1994年正式公布。隨着計算機工作能力的增強,Unicode也在面世以來的十多年里得到普 及。最新版本的 Unicode 是 2005年3月31日推出的Unicode 4.1.0 。另外,5.0 Beta已於2005年12月12日推出,以供各會員評價。

Unicode 編碼系統可分為編碼方式和實現方式兩個層次。

編碼方式:Unicode 的編碼方式與 ISO 10646 的通用字符集(Universal Character Set,UCS)概念相對應,目前的用於實用的 Unicode 版本對應於 UCS-2,使用16位的編碼空間。也就是每個字符占用2個字節。這樣理論上一共最多可以表示 216 個字符。基本滿足各種語言的使用。實際上目前版本的 Unicode 尚未填充滿這16位編碼,保留了大量空間作為特殊使用或將來擴展。

實現方式:Unicode 的實現方式不同於編碼方式。一個字符的 Unicode 編碼是確定的。但是在實際傳輸過程中,由於不同系統平台的設計不一定一致,以及出於節省空間的目的,對 Unicode 編碼的實現方式有所不同。Unicode 的實現方式稱為Unicode轉換格式(Unicode Translation Format,簡稱為 UTF)。如,UTF-8 編碼,這是一種變長編碼,它將基本7位ASCII字符仍用7位編碼表示,占用一個字節(首位補0)。而遇到與其他 Unicode 字符混合的情況,將按一定算法轉換,每個字符使用1-3個字節編碼,並利用首位為0或1進行識別。

Java與C#語言都是采用Unicode編碼方式,在這兩種語言中定義一個字符,在內存中存放的就是這個字符的兩字節Unicode碼。如下所示:

char a='我';    => 內存中存放的Unicode碼為:25105

----

上面unsigned char input[50] ,這屬於聲明了Unicode編碼格式,所以你后面的那句話“問題又產生了”,沒有任何意義。我個人的看法

 

 


免責聲明!

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



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