程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++中文字符相關應用方法詳解

C++中文字符相關應用方法詳解

編輯:C++入門知識

C++編程語言應用方式靈活,可以幫助開發人員輕松的實現許多功能需求。今天為大家介紹的C++中文字符的相關處理,就可以以多種方式來實現。大家可以通過這一方法來充分掌握這方面的應用技巧。

  • C++ include機制基本概念詳解
  • C++遍歷集合應用經驗總結
  • C++賦值函數代碼詳解
  • C++變量聲明相關概念解析
  • C++實現WPF動畫具體操作方法詳解

一 引入問題

代碼 wchar_t a[3]=L”中國”,編譯時出錯,出錯信息為:數組越界。但wchar_t 是一個寬字節類型,數組a的大小應為6個字節,而兩個漢字的的unicode碼占4個字節,再加上一個結束符,最多6個字節,所以應該不會越界。難道是編譯器出問題了?

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

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

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

1.漢字編碼方式的介紹

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

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

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

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

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

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

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

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

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

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

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

2.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++中輸出漢字字符的過程。

  1. unsigned char input[50];  
  2. cin>>input;  
  3. int flag=0;  
  4. for(int i =0 ;i < 50 ;i++)  
  5. {  
  6. if(input[i] > 0xa0 && input[i] != 0)  
  7. {  
  8. if(flag == 1)  
  9. {  
  10. cout<<"chinese character"<<endl;  
  11. flag = 0;  
  12. }  
  13. else  
  14. {  
  15. flag++;  
  16. }  
  17. }  
  18. else if(input[i] == 0)  
  19. {  
  20. break;  
  21. }  
  22. else   
  23. {  
  24. cout<<"english character"<<endl;  
  25. }  

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

  1. english character  
  2. english character  
  3. english character  
  4. english character  
  5. english character  
  6. chinese character  
  7. chinese character 

vc/c++中的英文字符仍然采用ASCII編碼方式。可以設想,其他國家程序員利用vc/c++編寫程序輸入本國字符時,vc/c++則會采用該國的字符編碼方式來處理這些字符。問題又產生了,韓國的vc/c++程序在中國的vc/c++上運行時,如果沒有相應的內碼庫,則對韓語字符的顯示有可能出現亂碼。

我個人猜測,vc安裝程序中應該帶有不同國家的內碼庫,這樣一來肯定會占用很大的空間。如果所有的國家使用統一的編碼方式,且所有的程序設計語言和開發工具都支持這種編碼方式該多好!而現實中,確實已經有這種編碼方式了,且許多新的語言也都支持這種編碼方式,如Java、C#等,它就是下面的Unicode編碼。

以上就是對C++中文字符的相關概念介紹。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved