在Win32中使用扩展ASCII排序表的C语言技术

4

在现有的应用程序中,使用API将所有ASCII字符转换为大写字节进行排序。Cafe == CAFE == Café == CAFÉ。 字符e,é和E都变成了字符E,以排序名称排序。因此,表示é的字节值的table [137]的值为69(“E”)。

我已经使用旧版本的Win32 API执行了一些测试,该API可以转换整个字符串,但无法将字符é转换为字符É或预期的字符E。

如何使用旧版Windows API完成这项工作?


2
现在有许多不同的8位扩展ASCII字符集,但使用它们没有任何意义。请使用Unicode编码和Unicode库进行排序。 - David Heffernan
谢谢,我会接受“不”的回答。该应用程序及其环境(不仅限于Win32)的年代比“现在”(甚至几十年前)要早得多,并且不支持Unicode,但是目前似乎没有适用于当前代码页的API了。对于一个不完全支持Unicode的环境来说,Unicode可能有些过头了,但我会考虑在Win32中使用它。尽管如此,我还是很惊讶Win32 API之一没有将é大写。(café -> CAFé)。表格也可以是一个选项,因为已知使用的高ASCII字符数量为7个。 - Xynixme
2
如果标准的C库函数toupper()不能满足您的需求,那么最好的方法可能就是定义自己的256字节查找表。这样做容易实现,在运行时速度快...并且可以完全控制a)字符编码(例如DOS代码页问题,如OEM 437与OEM 858),以及b)不容易映射到英文"A-Z"的字符(如é或\t)。 - paulsm4
1个回答

1

通过最终几乎按照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()。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接