共用方式為


處理字串

Windows 原生支援 UI 元素、檔案名等的 Unicode 字串。 Unicode 是慣用的字元編碼方式,因為它支援所有字元集和語言。 Windows 代表使用 UTF-16 編碼的 Unicode 字元,其中每個字元都會編碼為一或兩個 16 位值。 UTF-16 字元稱為 字元,以區別 8 位 ANSI 字元。 Visual C++ 編譯器支援寬字元的內建資料類型 wchar_t 。 標頭檔 WinNT.h 也會定義下列 typedef

typedef wchar_t WCHAR;

您會在 MSDN 範例程式碼中看到這兩個版本。 若要宣告寬字元常值或寬字元字串常值,請將 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。 當定義預處理器符號 UNICODE 或 ANSI 版本時,Windows 標頭也會定義可解析為 Unicode 版本的宏。

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

在 MSDN 中,函式會記錄在 SetWindowText名稱下,即使這是宏名稱,但不是實際的函式名稱。

新的應用程式應該一律呼叫 Unicode 版本。 許多世界語言都需要 Unicode。 如果您使用 ANSI 字串,將無法將應用程式當地語系化。 ANSI 版本也較不有效率,因為作業系統必須在執行時間將 ANSI 字串轉換成 Unicode。 根據您的喜好設定,您可以明確呼叫 Unicode 函式,例如 SetWindowTextW,或使用宏。 MSDN 上的範例程式碼通常會呼叫宏,但兩個表單完全相同。 Windows 中大部分較新的 API 只有 Unicode 版本,沒有對應的 ANSI 版本。

TCHAR

當應用程式需要同時支援Windows NT和 Windows 95、Windows 98 和 Windows Me 時,根據目標平臺,針對 ANSI 或 Unicode 字串編譯相同的程式碼很有用。 為此,Windows SDK 會根據平臺提供將字串對應至 Unicode 或 ANSI 的宏。

巨集 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。 不過,您可能會在舊版程式碼和部分 MSDN 程式碼範例中看到它們。

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

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

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

下一個

什麼是視窗?