操作字符串

Windows 本机支持 UI 元素、文件名等的 Unicode 字符串。 Unicode 是首选的字符编码,因为它支持所有字符集和语言。 Windows 使用 utf-16 编码表示 Unicode 字符,其中每个字符都编码为16位值。 UTF-16 字符称为 字符,用于将它们与8位 ANSI 字符区分开来。 Visual C++ 编译器支持用于宽字符的内置数据类型 wchar _ t 。 头文件 Winnt.sif 还定义以下 typedef

typedef wchar_t WCHAR;

你将在 MSDN 示例代码中看到这两个版本。 若要声明宽字符文本或宽字符字符串,请将 L 置于文本之前。

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

下面是你将看到的一些其他与字符串相关的 typedef:

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 标头还定义了一个宏,该宏在定义预处理器符号或 ANSI 版本时解析为 Unicode 版本 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 版本。

TCHARs

返回支持同时支持 Windows NT 和 Windows 95、Windows 98 和 Windows Me 的应用程序时,为 ANSI 或 Unicode 字符串编译相同的代码是非常有用的,具体取决于目标平台。 为此,Windows SDK 提供将字符串映射到 Unicode 或 ANSI (具体取决于平台)的宏。

Unicode ANSI
TCHAR wchar_t char
文本 ( "x" ) L"x" "x"

例如,以下代码:

SetWindowText(TEXT("My Application"));

解析为以下其中一项:

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

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

目前, 文本TCHAR 宏不太有用,因为所有应用程序都应使用 Unicode。 但是,你可能会在较旧的代码和一些 MSDN 代码示例中看到它们。

Microsoft C 运行时库的标头定义一组类似的宏。 例如,如果未定义,则 _ tcslen 解析为 strlen _UNICODE ; 否则,它将解析为 wcslen,这是 strlen 的宽字符版本。

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

请注意:一些标头使用预处理器符号 UNICODE ,其他标头使用 _UNICODE 下划线前缀。 始终定义这两个符号。 默认情况下,当你创建新的项目时,Visual C++ 默认设置它们。

下一步

什么是窗口?