compareStringEx 函数 (stringapiset.h)

比较由 name 指定的 区域 设置的两个 Unicode (宽字符) 字符串。

谨慎 错误地使用 CompareStringEx 可能会损害应用程序的安全性。 未正确比较的字符串可能会产生无效的输入。 测试字符串以确保它们在使用前有效,并提供错误处理程序。 有关详细信息,请参阅 安全注意事项:国际功能
 
注意 如果设计为仅在 Windows Vista 及更高版本上运行,则应用程序应优先调用 CompareString
 

语法

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 以获取默认行为。

标志 含义
LINGUISTIC_IGNORECASE
在语言上适当时忽略大小写。
LINGUISTIC_IGNOREDIACRITIC
在语言上适当时忽略非节奏字符。
注意 当与分解字符(即基字符和一个或多个非节奏字符各自具有不同的码位值)一起使用时,此标志并不总是产生可预测的结果。
 
NORM_IGNORECASE
忽略大小写。 对于许多脚本 (特别是拉丁语脚本) ,NORM_IGNORECASE与LINGUISTIC_IGNORECASE一致。
注意 NORM_IGNORECASE忽略任何第三级区分,无论它是否实际上是语言大小写。 例如,在阿拉伯语和 Indic 脚本中,这会区分字符的备用形式,但差异与语言大小写不对应。 LINGUISTIC_IGNORECASE会导致函数仅忽略实际的语言大小写,而不是忽略第三个排序权重。
 
注意 设置此标志后, 函数将忽略 CJK 兼容字符的宽格式和窄格式之间的区别。
 
NORM_IGNOREKANATYPE
不要区分平假名和片假名字符。 相应的平假名和片假名字符比较为相等。
NORM_IGNORENONSPACE
忽略非节奏字符。 对于许多脚本 (特别是拉丁语脚本) ,NORM_IGNORENONSPACE与LINGUISTIC_IGNOREDIACRITIC一致。
注意 NORM_IGNORENONSPACE忽略任何次要区别,无论它是否为音调符号。 朝鲜语、日语、中文和印度语等语言的脚本将这种区别用于音调符号以外的其他用途。 LINGUISTIC_IGNOREDIACRITIC会导致函数仅忽略实际音调符号,而不是忽略第二个排序权重。
 
注意NORM_IGNORENONSPACE仅对重音字符从main字符进行第二次传递排序的区域设置有效。 通常,首先比较字符串中的所有字符而不考虑重音,如果字符串相等,则执行第二次传递字符串以比较重音符。 此标志会导致不执行第二次传递。 对于在第一次传递中对重音字符进行排序的区域设置,此标志不起作用。
 
NORM_IGNORESYMBOLS
忽略符号和标点符号。
NORM_IGNOREWIDTH
忽略半角字符和全角字符之间的差异,例如 C a t == cat。 全角窗体是中文和日文脚本中使用的格式差异。
NORM_LINGUISTIC_CASING
使用默认语言规则进行大小写,而不是文件系统规则。 请注意, CompareStringEx 的 大多数方案都使用此标志。 应用程序调用 CompareStringOrdinal 时,不必使用此标志。
SORT_DIGITSASNUMBERS
Windows 7: 在排序过程中将数字视为数字,例如,在“10”之前对“2”进行排序。
SORT_STRINGSORT
将标点视为与符号相同。

[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 指示的字符串。
如果函数不成功,则返回 0。 若要获取扩展的错误信息,应用程序可以调用 GetLastError,这会返回以下错误代码之一:
  • ERROR_INVALID_FLAGS。 为标志提供的值无效。
  • ERROR_INVALID_PARAMETER。 任何参数值都无效。

注解

dwCmpFlags 设置为 0 或 NORM_IGNORECASE、cchCount1cchCount2 设置为 -1 且区域设置不支持任何语言压缩时,CompareString 和 CompareStringEx 都经过优化,以最高速度运行,就像传统的西班牙语排序将“ch”视为单个字符时一样。

CompareStringCompareStringEx 在比较期间都忽略阿拉伯语 kashida。 因此,如果两个字符串相同,但存在 kashidas,则函数返回CSTR_EQUAL。

当应用程序将 NORM_IGNORENONSPACE 和 NORM_IGNORECASE 标志与排序函数一起使用时,这些标志有时会干扰字符串比较。 这种情况可能会导致区域设置不支持非间距字符或大小写,但使用等效的权重级别来处理其他重要操作。 在这种情况下,应用程序应使用 LINGUISTIC_IGNOREDIACRITIC 和 LINGUISTIC_IGNORECASE 标志。 这些标志提供语言上适当的结果,用于对使用大小写和音调符号的码位进行排序,并且不会影响其他码位。

从 Windows Vista 开始: CompareStringCompareStringEx 都可以从自定义区域设置检索数据。 不保证数据在计算机之间或应用程序运行之间的数据相同。 如果应用程序必须保留或传输数据,请参阅 使用持久区域设置数据

从 Windows 8 开始:如果你的应用将语言标记从 Windows.Globalization 命名空间传递到此函数,它必须首先通过调用 ResolveLocaleName 来转换标记。

从 Windows 8 开始:CompareStringEx 在 Stringapiset.h 中声明。 在Windows 8之前,它在 Winnls.h 中声明。

注意 排序行为在 Windows 版本之间可能会更改。 例如,可能创建了新的 Unicode 码位。 使用 GetNlsVersionEx 发现排序版本是否已更改。
 

示例

可在 NLS 中找到显示此函数用法的示例 :基于名称的 API 示例

要求

要求
最低受支持的客户端 Windows Vista [桌面应用 | UWP 应用]
最低受支持的服务器 Windows Server 2008 [桌面应用 | UWP 应用]
目标平台 Windows
标头 stringapiset.h (包括 Windows.h)
Library Kernel32.lib
DLL Kernel32.dll

另请参阅

CompareString

自定义区域设置

处理应用程序中的排序

国家/地区语言支持

国家/地区语言支持函数

安全注意事项:国际功能

使用 Unicode 规范化来表示字符串