为何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
相关产品推荐
相关产品推荐

