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 |
PSTR或LPSTR | char* |
PCSTR或LPCSTR | const char* |
PWSTR或LPWSTR | wchar_t* |
PCWSTR或LPCWSTR | 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.
TEXT和TCHAR宏今天不太有用,因为所有的应用程序都应该使用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