我是 MFC 的新手。我正在尝试做简单的 mfc 应用程序,但我在某些地方感到困惑。例如,SetWindowText
有两个 api SetWindowTextA
,SetWindowTextW
一个 api 接受char *
,另一个接受wchar_t *
。
char *
和有什么用wchar_t *
?
char
用于所谓的 ANSI 函数族(通常函数名以 结尾A
),或更通常称为使用 ASCII 字符集。
wchar_t
用于新的所谓 Unicode(或 Wide)系列函数(通常函数名称以 结尾W
),它们使用 UTF-16 字符集。它与 UCS-2 非常相似,但又不完全一样。如果字符需要超过 2 个字节,它将被转换为 2 个复合代码点,这可能会非常混乱。
如果您想将一个转换为另一个,这并不是一件简单的任务。您将需要使用类似的东西MultiByteToWideChar
,这需要知道并提供输入 ANSI 字符串的代码页。
在 Windows 上,APIchar *
使用当前代码页,而wchar_t *
API 使用 UTF-16。因此,您应该始终wchar_t
在 Windows 上使用。推荐的方法是:
// Be sure to define this BEFORE including <windows.h>
#define UNICODE 1
#include <windows.h>
当UNICODE
被定义时,类似的 APISetWindowText
将被命名为别名,SetWindowTextW
因此可以安全地使用。没有UNICODE
,SetWindowText
将被别名为SetWindowTextA
,因此如果不首先转换为当前代码页就不能使用。
wchar_t
但是,当您不调用 Windows API 时,没有充分的理由使用它,因为它的可移植功能没有用,而且它的有用功能不可移植(wchar_t
仅在 Windows 上是 UTF-16,在大多数其他平台上是 UTF-32,真是一团糟。)
SetWindowTextA 采用 char* ,它是指向 ANSI 字符串的指针,而 SetWindowTextW 采用 wchar_t* 可以指向宽字符串,即 Unicode。
根据您正在构建的应用程序的类型,SetWindowText 已在标头 Windows.h 中对其中任何一个进行了#定义。如果您正在构建 UNICODE 构建,那么您的代码将自动使用 SetWindowTextW。
SetWindowTextA 主要用于支持需要构建为 SBCS(单字节字符集)的遗留代码
char* :表示这是一个指向char类型数据的指针。
例子
// Regular char
char aChar = 'a';
// Pointer to char
char* aPointer = new char;
*aPointer = 'a';
// Pointer to an array of 10 chars
char* anArray = new char[ 10 ];
*anArray = 'a';
anArray[ 1 ] = 'b';
// Also a pointer to an array of 10
char[] anArray = new char[ 10 ];
*anArray = 'a';
anArray[ 1 ] = 'b';
wchar_t* : wchar_t 的定义使得任何语言环境的 char 编码都可以转换为 wchar_t 表示,其中每个 wchar_t 恰好代表一个代码点。