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

2017-12-25 21:18:07来源:CSDN作者:qq_37422196人点击

分享

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 定义
CHAR char
PSTRLPSTR char*
PCSTRLPCSTR const char*
PWSTRLPWSTR wchar_t*
PCWSTRLPCWSTR const 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的宏,具体取决于平台。

Unicode ANSI
TCHAR wchar_t char
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

相关文章

    无相关信息

最新文章

123

最新摄影

闪念基因

微信扫一扫

第七城市微信公众平台