ANSI和UNICODE編程的注意事項

創建UNICODE編碼工程

    在VC60下,默認方式下創建的是ANSI編碼的工程(注:編譯的exe內部,其資源字符是以UNICODE保存),創建UNICODE編碼工程的方法:程序員

一、爲工程添加UNICODE和_UNICODE預處理選項。
  
  具體步驟:打開[工程]->[設置…]對話框,在C/C++標籤對話框的「預處理程序定義」中去除_MBCS,加上_UNICODE,UNICODE。(注意中間用逗號隔開)。函數

  在沒有定義UNICODE和_UNICODE前,全部函數和類型都默認使用ANSI的版本;在定義了UNICODE和_UNICODE以後,全部的MFC類和Windows API都變成了寬字節版本了。字體

二、設置程序入口點編碼

  由於MFC應用程序有針對Unicode專用的程序入口點,咱們要設置entry point。不然就會出現鏈接錯誤。code

  設置entry point的方法是:打開[工程]->[設置…]對話框,在Link頁的Category:Output類別的Entry Point裏填上wWinMainCRTStartup。資源

程序員的幾個注意事項

一、用THCAR代替char字符串

二、字符串加_T(""),如_T("你好")編譯

三、用_tcscpy等代替strcpy等程序

    ANSI操做函數以str開頭,如strcpy(),strcat(),strlen();方法

    Unicode操做函數以wcs開頭,如wcscpy,wcscpy(),wcslen();

    ANSI/Unicode互爲兼容的操做函數以_tcs開頭 _tcscpy(C運行期庫);

    ANSI/Unicode互爲兼容的操做函數以lstr開頭 lstrcpy(Windows函數);

    考慮ANSI和Unicode的兼容,咱們須要使用以_tcs開頭或lstr開頭的通用字符串操做函數。

這樣,你在ANSI/UNICODE環境下編譯時,能夠不修改代碼。

ANSI/UNICODE下的字符轉換和其它

    一、在ANSI下,若是程序自己產生的字符(串),如在代碼中直接賦值的CString str = _T("你好"),不須要轉換,可是,字符(串)是從其它地方來的,如讀取UNICODE編碼的文件,通訊接收的UNICODE數據,則須要轉換,轉換使用上面兩個函數。

    二、同理,在UNICODE下,若是程序自己產生的字符(串),如在代碼中直接賦值的CString str = _T("你好"),不須要轉換,可是,字符(串)是從其它地方來的,如讀取ANSI編碼的文件,通訊接收的ANSI數據,則須要轉換,轉換使用上面兩個函數。

    三、無論是ANSI,仍是UNICODE,在資源中的字符串,如String Table中的、對話框的靜態文本,都不須要轉換,由於它們編譯後是以UNICODE保存在.exe中的。

    對話框上的漢字,只要是簡繁同形的,同一個.exe運行在簡體Windows和繁體Windows下均可以正常顯示,固然二者必需要有對應的字體(庫),都用System字體是能夠的,或者簡體Windows下用「宋體」,繁體Windows下用「新細明體」。簡體的「中」和繁體的「中」字體相同,是簡繁同形,簡體的「國」和繁體的「國」字形不一樣,是簡繁異形。

    四、另外,同一個字符串在ANSI和UNICODE下計數個數不一樣。如「123你好」,在ANSI下是7個字符,在UNICODE下是5個字符。使用CString 的.GetLength()時要特別注意。

相關文章
相關標籤/搜索