Unicode字符串的MFC支持及其在Visual Studio中的設置

1. 問題及分析

 

最近在本身寫的MFC程序時,編譯老是碰到如下的相似的問題:windows

error C2664: 'BOOL CDC::TextOutW(int,int,const CString &)' : cannot convert parameter 3 from 'const char [13]' to 'const CString &'app

相似的問題還有「MessageBoxW」的問題。函數

 

到出錯的代碼處轉到定義後發現以下代碼:編碼

 

[cpp] view plain copyspa

  1. #ifdef UNICODE  
  2. #define TextOut  TextOutW  
  3. #else  
  4. #define TextOut  TextOutA  


可知是定義了UNICODE編碼後,編譯跳到了TextOutW,而咱們原本想使用的是TextOutA。以前的解決方法是直接在代碼中把TextOut強制性改成TextOutA來使用該函數(可是感受這樣指標不治本)。因而思量着VS的工程設置裏應該有設置不使用UNICODE編碼。.net

 

 

2. 解決方法及延伸

經過分析可知這是因爲使用了UNICODE編碼所產生的編譯問題(若是你確實想使用UNICODE編碼,請按照TextOutW的參數表來填寫參數),經過如下的工程設置能夠取消UNICODE編碼:設計

Project-->Properties-->General-->Project Defaults-->Character Set,接着選擇Use Unicode Character Set(使用Unicode字符集)以外的選項,如圖:代理

 

能夠看到使用Not Set或者Use Muti-Byte Character Set的選項,Not Set則是使用普通的ASCII碼,後者爲多字節字符集(MBCS),若是你的代碼中有中文或者其餘非英文類語言,建議仍是使用MBCS或者UNICODE,由於ASCII碼還不足以用來表示相似中文這樣的多字節語言。code

 

如今MFC也能很好地支持UNICODE與MBCS。其實在新建MFC工程的時候就能選擇是否使用UNICODE:blog

 

有關UNICODE的與MBSC的支持能夠查看相關MSDN:

http://msdn.microsoft.com/zh-cn/library/cc468203(v=vs.71).aspx#_core_mfc_support_for_mbcs_strings

 

下面也稍微介紹一下這兩種編碼方式。

ASCII字符集的缺陷:ASCII 字符集只有256個字符,用 0-255 之間的數字來表示。包括大小寫字母、數字以及少數特殊字符;如標點符號、貨幣符號等。對於大多數拉丁語言來講,這些字符已經夠用。可是,許多亞洲和東方語言所用的字符遠遠不止256個字符。

 

ANSI編碼與MBCS(多字節編碼):ANSI(美國國家標準協會),也就是說,每一個國家(非拉丁語系國家)本身制定本身的文字的編碼規則,並獲得了ANSI承認,符合ANSI的標準,全世界在表示對應國家文字的時候都通用這種編碼就叫ANSI編碼。至於簡體中文編碼GB2312,實際上它是ANSI的一個代碼頁936。

多字節字符系統或者字符集,基於ANSI編碼的原理上,對一個字符的表示實際上沒法肯定他須要佔用幾個字節的,只能從編碼自己來區分和解釋。所以計算機在存儲的時候,就是採用多字節存儲的形式。也就是你須要幾個字節我給你放幾個字節,好比A我給你放一個字節,好比"中「,我就給你放兩個字節,這樣的字符表示形式就是MBCS。在基於GBK的windows中,不會超過2個字節,因此windows這種表示形式有叫作DBCS(Double-Byte Chactacter System),其實算是MBCS的一個特例。
C語言默認存放字符串就是用的MBCS格式。從原理上來講,這樣是很是經濟的一種方式。

 

UNICODE編碼:如上,ANSI有不少代碼頁,使用不一樣代碼頁的內碼沒法在其餘代碼也正常顯示,這就是爲何日文版/繁體中文版遊戲沒法在簡體中文平臺直接顯示的緣由.
Unicode也是一種字符編碼方法,不過它是由國際組織設計,能夠容納全世界全部語言文字的編碼方案.它是一種2字節編碼,可以提供65536個字符,這個數字是不夠表示全部的字符的(漢語就有55000多字符),因此,經過一個代理對的機制來實現附加的917,476個字符表示,以達到全部字符都具備惟一編碼.

 

有關編碼的更多資料請參閱:

http://blog.csdn.net/softman11/article/details/6124345

相關文章
相關標籤/搜索