在现有的应用程序中,使用API将所有ASCII字符转换为大写字节进行排序。Cafe == CAFE == Café == CAFÉ。 字符e,é和E都变成了字符E,以排序名称排序。因此,表示é的字节值的table [137]的值为69(“E”)。
我已经使用旧版本的Win32 API执行了一些测试,该API可以转换整个字符串,但无法将字符é转换为字符É或预期的字符E。
如何使用旧版Windows API完成这项工作?
在现有的应用程序中,使用API将所有ASCII字符转换为大写字节进行排序。Cafe == CAFE == Café == CAFÉ。 字符e,é和E都变成了字符E,以排序名称排序。因此,表示é的字节值的table [137]的值为69(“E”)。
我已经使用旧版本的Win32 API执行了一些测试,该API可以转换整个字符串,但无法将字符é转换为字符É或预期的字符E。
如何使用旧版Windows API完成这项工作?
通过最终几乎按照paulsm4的建议操作,问题已解决。
输入代码页应该是已知的:850。858也可能被支持,但我们假设是850。我已经不得不将一些已知字符转换为HTML,因此我知道输入文本中出现了哪些字符。
我使用一个函数来处理(14个)异常情况(和a-z),而不是使用表格:
case 'ë':
case 'é':
return 'E';
case 'ï':
return 'I';
原始的动态API(不同操作系统)或toupper()可能确实是最好的选择,尽管有人可能会认为é应该变成E或É。
对于有限且已知数量的例外情况,使用静态值的函数也是一种选项。
最后,可以使用另一个原始操作系统来生成具有最多256个元素的静态完整表格的代码。这样您就不必手动输入512个数字并正确无误。
另一个罕见的旧操作系统具有返回<=256个值的API,使用当前代码页:
if (name[i]<=length_table)
sortname[i]=table[i];
else
sortname[i]=name[i];
sortname[i]=table(i);
速度不是问题,但新功能首先处理更常见的字符。它是定制的,所以我不会在这里发布。理论上,如果字符<= 127,则可以使用toupper()。