初步说明:鉴于问题本身的上下文,此答案中的Unicode和Unicode 字符是指 UCS-2(最高 XP)和 UTF-16(从 XP 开始)编码,可与宽字符、wchar_t
和WCHAR
其他字符互换使用Win32 API 上下文中的术语。Unicode 标准提供多种编码,例如 UTF-8、UTF-16 和 UTF-32 来编码相同数量的字符——标准的不同版本具有不同的范围。代理代码点用于从基本多语言平面 (BMP) 中逃逸,大约是前 64K 代码点,因此编码的内容超过了 16 位字符和每个代码点一个字符的编码范围。代理扩展是为 Unicode 2.0 标准开发的,该标准在 NT 4.0 发布的那一年通过,但在 Windows 的第一个“支持 Unicode”的版本 NT 3.51 发布几年后。该原始标准没有考虑比 BMP 更多的字符,这就是为什么Unicode 字符或宽字符现在甚至在 Win32 API 上下文中用作Unicode的同义词,尽管这是不准确的。
要回答您提出的基本问题:
使用“==”运算符是否wchar_t
根本无法比较字符串?
不,它们不是,“ANSI”字符串也不是,即使用char
类型作为基础。请记住,C 字符串(包括基于wchar_t
的char
)是一个指针。这意味着==
您正在比较两个绝对不相等的指针值。毕竟,一个是文字字符串(即在您的程序映像中),而另一个分配在堆上的某个位置。所以他们绝对是两个不同的实体。
如果您想使用 ,则==
必须使用诸如 C++ 之类的带有 STL 类std::string
(或std::basic_string<_TCHAR>
)或(在 Windows 上)ATL 类CString
(或更确切地说CStringT
)的语言。这些类有时称为智能字符串类,并使用 C++ 工具覆盖operator==()
. 但是,您应该记住,语义因实现而异,因此并非每个智能字符串类都会比较字符串内容。有些人可能只比较 的相等性this
(即它是否是同一个实例),而另一些人可能会自行比较字符串内容不区分大小写或区分大小写。
要比较 C 字符串,您可以使用以下函数:
- 对于“ANSI”字符 (
char
) 字符串:strcmp
, _stricmp
(以及“计数”变体:_strncmp
, _strnicmp
... 还有更多)
- 对于 Unicode 字符 (
wchar_t
) 字符串:wcscmp
, _wcsicmp
(以及“计数”变体:_wcsncmp
, _wcsnicmp
... 还有更多)
- 对于变量字符“类型”(
TCHAR
)字符串: _tcscmp
,_tcsicmp
(和“计数”变体:_tcsncmp
,_tcsnicmp
......还有更多)
你可以记住这些前缀:
str
-> 字符串
wcs
-> 宽字符串
tcs
-> T 字符串
旁注: with#include <tchar.h>
和windows.h
宏TEXT
and_T
是等价的,用于声明一个字符串文字,根据构建时的定义,它要么是“ANSI”,要么是 Unicode。显然,这同样适用,_TCHAR
而TCHAR
后者似乎在 Win32 API 上下文中受到青睐。
因此,Unicode 构建将扩展_T("something")
为L"something"
,而“ANSI”构建将扩展为"something"
.
至于 TCHAR,请考虑通读以下提出的论点:TCHAR 是否仍然相关?(由rubenvb指出) 有赞成和反对TCHAR
/_TCHAR
使用的有效观点,您应该做出决定并坚持下去 - 即保持一致。