Windows桌面應用開發-字符串的使用

MSDN上英語原文 

Windows原生支持UI(用戶界面)元素、文件名等等的Unicode字符串。Unicode是首選的字符編碼,因爲它支持所有的字符集和語言,Windows使用的是UTF-16編碼的字符,其每一個字符都是一個16位值的編碼,爲了與8位的ANSI字符區分,UTF-16字符被稱爲寬字符。Visual C++編譯器內置了數據類型wchart_t以對寬字符的支持,頭文件WinNT.h中還定義了下列的類型定義:

	typedef wchar_t WCHAR;


MSDN示例代碼中會看到兩個版本,要聲明一個寬字符的字符或字符串,將L’放在前面:

wchar_t a=L’a’;

wchar_t *str=L”hello”;


下列是一些其它字符串相關的類型定義

類型定義

解釋

CHAR

char

PSTR / LPSTR

char*

PCSTR / LPCSTR

const char*

PWSTR / LPWSTR

wchar_t*

PCWSTR / LPCWSTR

const wchar_t

Unicode 和 ANSI 函數

當微軟推出支持UnicodeWindows,爲了過渡提供了兩套並行的API,一套支持ANSI字符串,另一套支持Unicode字符串。例如:以下兩個函數是設置窗體標題欄的文本:

  •  SetWindowTextA  採用一個ANSI字符串
  •  SetWindowTextW  採用一個Unicode字符串

在系統內,ANSI版本的字符串將轉換成Unicode。在Windows的頭文件裏定義了一個宏來解析Unicode預處理符號來決定使用的是ANSI版本還是Unicode版本。

#ifdef UNICODE

#define SetWindowText setWindowTextW

#else

#define SetWindowText SetWindowTextA

#endif


MSDN,函數文檔下的名稱使用的是SetWindowsText,即使實際上這是宏名而不是真實的函數名。

新的應用程序應該總是調用Unicode版本。世界上許多語言需要Unicode。如果你使用ANSI字符串,它會無法本地化應用程序。ANSI版本效率比較低,因爲在運行是系統必須將ANSI字符串轉化爲Unicode。根據你的喜好,你可以明確的調用Unicode版本,如SetWindowTextW,或是使用宏。MSDN的示例上使用的是調用宏,但是這兩種形式是等價的。Windows大多數較新的API只有Unicode版本而沒有ANSI版本。

TCHAR

當應用程序需要支持WindowsNTWindows95/WIndows98/WindowsME時,根據目標平臺,爲相同的代碼編譯成ANSIUnicode字符串它是相當有用的。爲此,Windows SDK提供了字符串映射到UnicodeANSI的宏。這取決於目標平臺

Unicode

ANSI

TCHAR

wchar_t

char

TEXT(“x”)

L”x”

“x”

示例代碼:

 

SetWindowText(TEXT(“My Application”));


解析爲以下操作之一:

SetWindowTextW(L”My Application”)); //寬字符字符串的Unicode函數

SetWindowTextA(“My Application”); //ANSI函數

 

TCHARTEXT宏如今的用處並不大,因爲所有的應用程序應該使用Unicode,然而,你可能會在較舊的代碼或MSDN示例代碼上看到。

微軟的C運行時庫的頭文件定義了一組相似的宏,例如,如果爲定義_UNICODE_tcslen解析爲strlen,否則它解析爲wcslen,這是strlen的寬字符版本。

#ifdef _NUICODE

#define _tcslen wcslen

#else

#define _tcslen strlen

#endif

 

注意: 有些頭是使用預處理器符號UNICODE,另外一些使用下劃線前綴_UNICODE。當你創建一個新項目時,默認情況下始終都定義兩個符號。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章