我是MFC的新手。我正在尝试简单的mfc应用程序,并且我在某些地方变得混乱。例如,SetWindowText
有两个api,SetWindowTextA
,SetWindowTextW
一个api需要char *
,另一个接受wchar_t *
。
char *
和wchar_t *
有什么用?
答案 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只代表一个代码点。