compareStringEx 函数 (stringapiset.h)
比较由 name 指定的 区域 设置的两个 Unicode (宽字符) 字符串。
语法
int CompareStringEx(
[in, optional] LPCWSTR lpLocaleName,
[in] DWORD dwCmpFlags,
[in] _In_NLS_string_(cchCount1)LPCWCH lpString1,
[in] int cchCount1,
[in] _In_NLS_string_(cchCount2)LPCWCH lpString2,
[in] int cchCount2,
[in, optional] LPNLSVERSIONINFO lpVersionInformation,
[in, optional] LPVOID lpReserved,
[in, optional] LPARAM lParam
);
参数
[in, optional] lpLocaleName
指向 区域设置名称或以下预定义值之一的指针。
[in] dwCmpFlags
指示函数如何比较两个字符串的标志。 默认情况下,不会设置这些标志。 此参数可以指定以下任意值的组合,也可以将其设置为 0 以获取默认行为。
标志 | 含义 |
---|---|
|
在语言上适当时忽略大小写。 |
|
在语言上适当时忽略非节奏字符。
注意 当与分解字符(即基字符和一个或多个非节奏字符各自具有不同的码位值)一起使用时,此标志并不总是产生可预测的结果。
|
|
忽略大小写。 对于许多脚本 (特别是拉丁语脚本) ,NORM_IGNORECASE与LINGUISTIC_IGNORECASE一致。
注意 NORM_IGNORECASE忽略任何第三级区分,无论它是否实际上是语言大小写。 例如,在阿拉伯语和 Indic 脚本中,这会区分字符的备用形式,但差异与语言大小写不对应。 LINGUISTIC_IGNORECASE会导致函数仅忽略实际的语言大小写,而不是忽略第三个排序权重。
注意 设置此标志后, 函数将忽略 CJK 兼容字符的宽格式和窄格式之间的区别。
|
|
不要区分平假名和片假名字符。 相应的平假名和片假名字符比较为相等。 |
|
忽略非节奏字符。 对于许多脚本 (特别是拉丁语脚本) ,NORM_IGNORENONSPACE与LINGUISTIC_IGNOREDIACRITIC一致。
注意 NORM_IGNORENONSPACE忽略任何次要区别,无论它是否为音调符号。 朝鲜语、日语、中文和印度语等语言的脚本将这种区别用于音调符号以外的其他用途。 LINGUISTIC_IGNOREDIACRITIC会导致函数仅忽略实际音调符号,而不是忽略第二个排序权重。
注意NORM_IGNORENONSPACE仅对重音字符从main字符进行第二次传递排序的区域设置有效。 通常,首先比较字符串中的所有字符而不考虑重音,如果字符串相等,则执行第二次传递字符串以比较重音符。 此标志会导致不执行第二次传递。 对于在第一次传递中对重音字符进行排序的区域设置,此标志不起作用。
|
|
忽略符号和标点符号。 |
|
忽略半角字符和全角字符之间的差异,例如 C a t == cat。 全角窗体是中文和日文脚本中使用的格式差异。 |
|
使用默认语言规则进行大小写,而不是文件系统规则。 请注意, CompareStringEx 的 大多数方案都使用此标志。 应用程序调用 CompareStringOrdinal 时,不必使用此标志。 |
|
Windows 7: 在排序过程中将数字视为数字,例如,在“10”之前对“2”进行排序。 |
|
将标点视为与符号相同。 |
[in] lpString1
指向要比较的第一个字符串的指针。
[in] cchCount1
lpString1 指示的字符串长度,不包括终止 null 字符。 如果字符串以 null 结尾,则应用程序可以提供负值。 在这种情况下, 函数会自动确定长度。
[in] lpString2
指向要比较的第二个字符串的指针。
[in] cchCount2
lpString2 指示的字符串长度,不包括终止 null 字符。 如果字符串以 null 结尾,则应用程序可以提供负值。 在这种情况下, 函数会自动确定长度。
[in, optional] lpVersionInformation
指向 NLSVERSIONINFOEX 结构的指针,该结构包含有关相关 NLS 功能的版本信息;通常从 GetNLSVersionEx 检索。
Windows Vista、Windows 7: 保留;必须设置为 NULL。
[in, optional] lpReserved
保留;必须设置为 NULL。
[in, optional] lParam
保留;必须设置为 0。
返回值
如果成功,则返回以下值之一。 若要保持比较字符串的 C 运行时约定,可以从非零返回值中减去值 2。 然后,0、==0 和 >0 的含义<与 C 运行时一致。
- CSTR_LESS_THAN。 lpString1 指示的字符串在词法值中小于 lpString2 指示的字符串。
- CSTR_EQUAL。 lpString1 指示的字符串在词法值中与 lpString2 指示的字符串等效。 这两个字符串在排序时是等效的,尽管不一定完全相同。
- CSTR_GREATER_THAN。 lpString1 指示的字符串在词法值中大于 lpString2 指示的字符串。
- ERROR_INVALID_FLAGS。 为标志提供的值无效。
- ERROR_INVALID_PARAMETER。 任何参数值都无效。
注解
当 dwCmpFlags 设置为 0 或 NORM_IGNORECASE、cchCount1 和 cchCount2 设置为 -1 且区域设置不支持任何语言压缩时,CompareString 和 CompareStringEx 都经过优化,以最高速度运行,就像传统的西班牙语排序将“ch”视为单个字符时一样。
CompareString 和 CompareStringEx 在比较期间都忽略阿拉伯语 kashida。 因此,如果两个字符串相同,但存在 kashidas,则函数返回CSTR_EQUAL。
当应用程序将 NORM_IGNORENONSPACE 和 NORM_IGNORECASE 标志与排序函数一起使用时,这些标志有时会干扰字符串比较。 这种情况可能会导致区域设置不支持非间距字符或大小写,但使用等效的权重级别来处理其他重要操作。 在这种情况下,应用程序应使用 LINGUISTIC_IGNOREDIACRITIC 和 LINGUISTIC_IGNORECASE 标志。 这些标志提供语言上适当的结果,用于对使用大小写和音调符号的码位进行排序,并且不会影响其他码位。
从 Windows Vista 开始: CompareString 和 CompareStringEx 都可以从自定义区域设置检索数据。 不保证数据在计算机之间或应用程序运行之间的数据相同。 如果应用程序必须保留或传输数据,请参阅 使用持久区域设置数据。
从 Windows 8 开始:如果你的应用将语言标记从 Windows.Globalization 命名空间传递到此函数,它必须首先通过调用 ResolveLocaleName 来转换标记。
从 Windows 8 开始:CompareStringEx 在 Stringapiset.h 中声明。 在Windows 8之前,它在 Winnls.h 中声明。
示例
可在 NLS 中找到显示此函数用法的示例 :基于名称的 API 示例。
要求
要求 | 值 |
---|---|
最低受支持的客户端 | Windows Vista [桌面应用 | UWP 应用] |
最低受支持的服务器 | Windows Server 2008 [桌面应用 | UWP 应用] |
目标平台 | Windows |
标头 | stringapiset.h (包括 Windows.h) |
Library | Kernel32.lib |
DLL | Kernel32.dll |