You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何WinAPI的CompareStringW将小写字母排在大写前?如何反转排序?

问题:WinAPI CompareStringW 实现大写字母优先的字符串排序

我使用WinAPI的CompareStringW函数进行字符串排序,但该函数会将"a"排在"A"之前。我希望实现大写字母在前的排序逻辑,请问该如何调整?

我的代码示例:

CompareStringW(LOCALE_USER_DEFAULT, NORM_LINGUISTIC_CASING or SORT_STRINGSORT, PChar(Str1), Length(Str1), PChar(Str2), Length(Str2));

解决方案

你当前用的NORM_LINGUISTIC_CASING标志是按语言习惯排序(通常小写在前),要实现大写优先,调整标志位即可,有两种方案:

方案1:使用SORT_UPPERCASEFIRST(Windows Vista及以上)

直接移除NORM_LINGUISTIC_CASING,添加SORT_UPPERCASEFIRST标志,这个参数会强制大写字母排在对应小写字母前面:

CompareStringW(LOCALE_USER_DEFAULT, SORT_STRINGSORT or SORT_UPPERCASEFIRST, PChar(Str1), Length(Str1), PChar(Str2), Length(Str2));

方案2:移除NORM_LINGUISTIC_CASING(兼容旧系统)

如果要兼容Windows XP这类旧版本,直接删掉NORM_LINGUISTIC_CASING就行。默认情况下,CompareStringW会按字符的Unicode码点排序,大写字母(A-Z:U+0041-U+005A)的码点本来就比小写字母(a-z:U+0061-U+007A)小,自然会排在前面:

CompareStringW(LOCALE_USER_DEFAULT, SORT_STRINGSORT, PChar(Str1), Length(Str1), PChar(Str2), Length(Str2));

之所以原来的代码会让小写在前,是因为NORM_LINGUISTIC_CASING会忽略大小写的码点差异,按语言语义排序,把"a"和"A"视为近似,甚至让小写优先,这不符合你的需求。

内容的提问来源于stack exchange,提问作者Wolf Country

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 20:31:09