使用字串
本主題說明 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 |
PSTR 或 LPSTR | char* |
PCSTR 或 LPCSTR | const char* |
PWSTR 或 LPWSTR | wchar_t* |
PCWSTR 或 LPCWSTR | 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.
TEXT 和 TCHAR 巨集目前不太有用,因為所有應用程式都應該使用 Unicode。
Microsoft C 執行時間連結庫的標頭會定義一組類似的巨集。 例如,如果 未定義,_tcslen解析為 strlen_UNICODE
;否則會解析為 wcslen,這是 strlen 的寬字元版本。
#ifdef _UNICODE
#define _tcslen wcslen
#else
#define _tcslen strlen
#endif
請小心:某些標頭會使用預處理器符號 UNICODE
,而其他標頭則搭配底線前置詞使用 _UNICODE
。 一律定義這兩個符號。 當您建立新專案時,Visual C++預設會設定兩者。