Windows桌面应用程序(1-2-1-3rd) 使用字符串

Windows本身支持用于UI元素,文件名等的Unicode字符串。Unicode是首选的字符编码,因为它支持所有的字符集和语言。Windows使用UTF-16编码表示Unicode字符,其中每个字符都被编码为16位值。UTF-16字符被称为字符,以区别于8位ANSI字符。Visual C++编译器支持宽字符的内置数据类型wchar_t。头文件WinNT.h也定义了下面的typedef

typedef wchar_t WCHAR;

您将在MSDN示例代码中看到两个版本。要声明一个宽字符或宽字符的字符串,将L放在字面上。

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

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

Typedef定义
CHARchar
PSTRLPSTRchar*
PCSTRLPCSTRconst char*
PWSTRLPWSTRwchar_t*
PCWSTRLPCWSTRconst wchar_t*

Unicode和ANSI函数
当Microsoft向Windows推出Unicode支持时,通过提供两组平行的API(一组用于ANSI字符串而另一组用于Unicode字符串)缓解了转换。例如,有两个函数可以设置窗口标题栏的文本:

  • SetWindowTextA采用ANSI字符串。
  • SetWindowTextW需要一个Unicode字符串。

在内部,ANSI版本将字符串转换为Unicode。Windows头文件还定义了一个宏,在预定义符号UNICODE被定义时解析为Unicode版本,否则定义为ANSI版本。

#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的宏,具体取决于平台。

UnicodeANSI
TCHARwchar_tchar
TEXT(“x”)L”x”“x”

例如,下面的代码:

SetWindowText(TEXT("My Application"));

解析为以下之一:

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

TEXTTCHAR宏今天不太有用,因为所有的应用程序都应该使用Unicode。但是,您可能会在旧代码和某些MSDN代码示例中看到它们。
Microsoft C运行库的头文件定义了一组类似的宏。例如,如果_UNICODE未定义,_tcslen解析为strlen;否则它解析为wcslen,这是strlen的宽字符版本。

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

注意:一些头文件使用预处理器符号UNICODE,而另一些使用带有下划线前缀的_UNICODE。总是定义这两个符号。Visual C++在创建新项目时默认将它们设置为它们。
下一个
什么是窗口?


原文链接:Working with Strings

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值