共用方式為


使用字串

本主題說明 Windows 如何支援 UI 元素、檔名等的 Unicode 字串(Unicode 是慣用的字元編碼,因為它支援所有字元集和語言)。

Windows 代表使用 UTF-16 編碼的 Unicode 字元,其中每個字元都會編碼為一或兩個 16 位值。 為了區別 8 位 ANSI 字元,UTF-16 字元稱為 字元。 Visual C++ 編譯程式支援寬字元的內建數據類型 wchar_t 。 頭檔 WinNT.h 也會定義下列 typedef

typedef wchar_t WCHAR;

若要宣告寬字元常值或寬字元字串常值,請將 L 放在常值之前。

wchar_t a = L'a';
wchar_t *str = L"hello";

下表列出一些其他字串相關的 typedefs:

Typedef 定義
CHAR char
PSTRLPSTR char*
PCSTRLPCSTR const char*
PWSTRLPWSTR wchar_t*
PCWSTRLPCWSTR const wchar_t*

Unicode 和 ANSI 函式

當Microsoft引進對 Windows 的 Unicode 支援時,它會提供兩組平行 API,一組用於 ANSI 字串串,另一組用於 Unicode 字串,以簡化轉換。 例如,有兩個函式可設定視窗標題列的文字:

  • SetWindowTextA 接受 ANSI 字串。
  • SetWindowTextW 接受 Unicode 字串。

在內部,ANSI 版本會將字串轉譯為 Unicode。 Windows 標頭也會定義巨集,以在定義預處理器符號 UNICODE 或 ANSI 版本時解析為 Unicode 版本。

#ifdef UNICODE
#define SetWindowText  SetWindowTextW
#else
#define SetWindowText  SetWindowTextA
#endif 

函式會記錄在 SetWindowText 名稱之下,即使這確實是巨集名稱,而不是實際的函式名稱。

新的應用程式應該一律呼叫 Unicode 版本。 許多世界語言都需要 Unicode。 如果您使用 ANSI 字串,就無法將應用程式當地語系化。 ANSI 版本也較不有效率,因為操作系統必須在運行時間將 ANSI 字串轉換成 Unicode。 根據您的喜好設定,您可以明確呼叫 Unicode 函式,例如 SetWindowTextW,或使用巨集。 最新的 Windows API 通常只有 Unicode 版本。

TCHAR

在某些情況下,根據目標平臺,針對 ANSI 或 Unicode 字串編譯相同的程式代碼可能很有用。 為此,Windows SDK 會根據平臺提供將字串對應至 Unicode 或 ANSI 的巨集。

Macro Unicode ANSI
TCHAR wchar_t char
TEXT("x")_T("x") L"x" "x"

例如,下列程式碼:

SetWindowText(TEXT("My Application"));

解析為下列其中一項:

SetWindowTextW(L"My Application"); // Unicode function with wide-character string.

SetWindowTextA("My Application");  // ANSI function.

TEXTTCHAR 巨集目前不太有用,因為所有應用程式都應該使用 Unicode。

Microsoft C 執行時間連結庫的標頭會定義一組類似的巨集。 例如,如果 未定義,_tcslen解析為 strlen_UNICODE;否則會解析為 wcslen,這是 strlen寬字元版本。

#ifdef _UNICODE
#define _tcslen     wcslen
#else
#define _tcslen     strlen
#endif 

請小心:某些標頭會使用預處理器符號 UNICODE,而其他標頭則搭配底線前置詞使用 _UNICODE 。 一律定義這兩個符號。 當您建立新專案時,Visual C++預設會設定兩者。

下一步

什麼是視窗?