如何对包含数字和字母的UTF-8字符串进行排序人物?

时间:2011-05-13 10:29:37

标签: c string qt sorting sqlite

我正在研究需要排序的程序(在c中)。 排序的要求之一是:数字排序。

数字排序应从最低有效数字(即最右边的数字)到最高有效数字完成 数字(即最左边的数字)使得数字21,2和11按如下方式排序:2,11,21。

给定的字符串是UTF-8,可能包含特殊字符,数字,拉丁字母,西里尔字母,平假名/片假名等。

它给出了以下排序顺序:

1

1A

图1b

2

11

110

110A

Henry7

Henry24

4 个答案:

答案 0 :(得分:2)

您可能需要考虑使用ICU library(Unicode的国际组件),其中包含collation (sorting) API

答案 1 :(得分:2)

我认为你的意思是“将文本字符串中的数字字符排序为数字。”您可以尝试使用Qt的QString::localeAwareCompare(),它使用区域设置和平台设置来比较字符串。至少在OS X上,这应该意味着它将尊重用户选择的区域设置,其中包括您想要的行为。

答案 2 :(得分:0)

或者,如果您不关心区域设置,可以将其转换为utf16并按代码点值排序。

答案 3 :(得分:0)

通过与std::sort进行检查,使用QString::localeAwareCompare()的自定义比较器功能。

比较器功能:

void sortLocaleAware(QStringList &sList)
{
    std::sort(sList.begin(), sList.end(), [](const QString &s1, const QString &s2){
        return s1.localeAwareCompare(s2) < 0;
    });
}

用法:

QStringList myList = { "4a", "3b", "52a" ,"13ş", "34İ" };
sortLocaleAware(myList);