char *和wchar_t之间的区别*

时间:2013-10-23 04:26:15

标签: c++ c string

我是MFC的新手。我正在尝试简单的mfc应用程序,并且我在某些地方变得混乱。例如,SetWindowText有两个api,SetWindowTextASetWindowTextW一个api需要char *,另一个接受wchar_t *

char *wchar_t *有什么用?

4 个答案:

答案 0 :(得分:13)

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

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

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

答案 1 :(得分:4)

在Windows上,char *使用当前代码页的API,而wchar_t * API使用UTF-16。因此,您应该始终在Windows上使用wchar_t。建议的方法是:

// Be sure to define this BEFORE including <windows.h>
#define UNICODE 1
#include <windows.h>

定义UNICODE后,SetWindowText之类的API将被别名化为SetWindowTextW,因此可以安全使用。如果没有UNICODE,则SetWindowText将别名为SetWindowTextA,因此如果没有先转换为当前代码页,则无法使用。

但是,当您不调用Windows API时,没有充分的理由使用wchar_t,因为它的便携功能无用,并且其有用的功能不可移植(wchar_t仅为UTF-16在Windows上,在大多数其他平台上,它是UTF-32,真是一团糟。)

答案 2 :(得分:1)

SetWindowTextA接受char *,它是指向ANSI字符串的指针,而SetWindowTextW取wchar_t *指向宽字符串又称Unicode。

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

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

答案 3 :(得分:-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只代表一个代码点。