Closed gexgd0419 closed 5 months ago
LocaleNameToLCID 在不支持该函数的 XP 系统上是查表实现的。
LocaleNameToLCID
https://github.com/Chuyu-Team/YY-Thunks/blob/b79ce32cc2d777838578f35467e6a281a8cdb98d/src/Thunks/api-ms-win-core-localization.hpp#L988-L993
表格为了二分查找做了排序,但是排序是按照区分大小写时的 ASCII 顺序排列的,例如 zh-HK 排在 zh-Hans 前面。
zh-HK
zh-Hans
https://github.com/Chuyu-Team/YY-Thunks/blob/b79ce32cc2d777838578f35467e6a281a8cdb98d/src/Thunks/api-ms-win-core-localization.hpp#L1340-L1345
而比较字符串时使用的 wcsicmp 会将两边字符串都转换成小写再比较,这样一来 zh-hans 应该排在 zh-hk 前面。顺序的错乱导致某些 locale name 不能正常转换得到 LCID。
wcsicmp
zh-hans
zh-hk
另外这个表格缺失某些项目,例如中性的 zh (LCID = 0x7804) 就没有出现在表格中。
zh
0x7804
感谢反馈,你说的非常有道理。这部分代码复制了CRT的locale downlevel,看起来吧微软的Bug一并带过来了。
我观察更新,你不仅修复了列表排序问题,还更新了表格里的内容,比如 prs-AF 更新为 fa-AF。 但是对于早期系统比如Vista,这任然是 prs-AF 。我不确定这样更改是否会带来其他灾难性的影响。我需要评估一下。
prs-AF
fa-AF
https://github.com/Chuyu-Team/YY-Thunks/releases/tag/v1.0.10-Beta1 已经修复,请查收
LocaleNameToLCID
在不支持该函数的 XP 系统上是查表实现的。https://github.com/Chuyu-Team/YY-Thunks/blob/b79ce32cc2d777838578f35467e6a281a8cdb98d/src/Thunks/api-ms-win-core-localization.hpp#L988-L993
表格为了二分查找做了排序,但是排序是按照区分大小写时的 ASCII 顺序排列的,例如
zh-HK
排在zh-Hans
前面。https://github.com/Chuyu-Team/YY-Thunks/blob/b79ce32cc2d777838578f35467e6a281a8cdb98d/src/Thunks/api-ms-win-core-localization.hpp#L1340-L1345
而比较字符串时使用的
wcsicmp
会将两边字符串都转换成小写再比较,这样一来zh-hans
应该排在zh-hk
前面。顺序的错乱导致某些 locale name 不能正常转换得到 LCID。另外这个表格缺失某些项目,例如中性的
zh
(LCID =0x7804
) 就没有出现在表格中。