12

我是 MFC 的新手。我正在尝试做简单的 mfc 应用程序,但我在某些地方感到困惑。例如,SetWindowText有两个 api SetWindowTextASetWindowTextW一个 api 接受char *,另一个接受wchar_t *

char *和有什么用wchar_t *

4

4 回答 4

20

char用于所谓的 ANSI 函数族(通常函数名以 结尾A),或更通常称为使用 ASCII 字符集。

wchar_t用于新的所谓 Unicode(或 Wide)系列函数(通常函数名称以 结尾W),它们使用 UTF-16 字符集。它与 UCS-2 非常相似,但又不完全一样。如果字符需要超过 2 个字节,它将被转换为 2 个复合代码点,这可能会非常混乱。

如果您想将一个转换为另一个,这并不是一件简单的任务。您将需要使用类似的东西MultiByteToWideChar,这需要知道并提供输入 ANSI 字符串的代码页。

于 2013-10-23T04:34:38.743 回答
4

在 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,真是一团糟。)

于 2013-10-23T04:32:55.960 回答
1

SetWindowTextA 采用 char* ,它是指向 ANSI 字符串的指针,而 SetWindowTextW 采用 wchar_t* 可以指向宽字符串,即 Unicode。

根据您正在构建的应用程序的类型,SetWindowText 已在标头 Windows.h 中对其中任何一个进行了#定义。如果您正在构建 UNICODE 构建,那么您的代码将自动使用 SetWindowTextW。

SetWindowTextA 主要用于支持需要构建为 SBCS(单字节字符集)的遗留代码

于 2013-10-23T04:34:34.997 回答
-4

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 恰好代表一个代码点。

于 2013-10-23T04:34:05.040 回答