【问题标题】:Sorting a string array in C++ no matter of 'A' or 'a' and with å, ä ö?在 C++ 中对字符串数组进行排序,无论是“A”还是“a”以及 å、ä ö?
【发布时间】:2010-03-22 16:41:07
【问题描述】:

如何在 C++ 中对字符串数组进行排序,以使其按以下顺序发生:

安卡先生

布朗先生

凯瑟先生

mR 驴

奥里什先生

艾特先生

先生 önD

//following not the way to get that order regardeless upper or lowercase and å, ä, ö
//in forloop... 
string handle;
point1 = array1[j].find_first_of(' ');
string forename1(array1[j].substr(0, (point1)));
string aftername1(array1[j].substr(point1 + 1));
point2 = array1[j+1].find_first_of(' ');
string forename2(array1[j+1].substr(0, (point2)));
string aftername2(array1[j+1].substr(point2 + 1));
if(aftername1 > aftername2){
    handle = array1[j];
    array1[j] = array1[j+1];
    array1[j+1] = handle;//swapping
}
if(aftername1 == aftername2){
    if(forname1 > forname2){
        handle = array1[j];
        array1[j] = array1[j+1];
        array1[j+1] = handle;   
    }
}

【问题讨论】:

    标签: c++ string sorting arrays


    【解决方案1】:

    一旦您将 unicode 字符混入其中,您就必须开始考虑国际化。不同的语言有不同的排序规则。例如,在荷兰语中,“IJ”被认为是一个字母,在字母表中有自己的位置。我推荐一个好的 Unicode 库来进行字符串词法比较,即 International Components for Unicode:http://site.icu-project.org/

    这样,您可以简单地将普通的std::sort 与 ICU 的比较器一起使用。

    【讨论】:

    • 它们是 Unicode 字符,还是只是一个 ANSI 代码页。毕竟他在使用“字符串”。
    • 取决于编码。如果他的源文件编码为 UTF-8,使用std::string 就可以了,每次出现的 Äå 都会用适当的字节序列来表示。伯克,伯克,伯克!
    • 我只是说你没有理由假设 Unicode。 std::wstring 将是使用 unicode 的良好证据。无论哪种方式,std::string 都没有说什么。
    • 触摸。无论它们是 UCS 中的字符还是某些单字节编码(如 latin1)中的字符,关键是应该使用基于区域设置的排序规则。
    • 如果他的源文件是UTF-8的,你还真说不上Ä是怎么表示的。它可以是 U+00E4 也可以是 U+0061 U+0308。不用说,确保将这些排序在一起是一项挑战。
    【解决方案2】:

    表格和转换。

    我首先将字符串转换为全部大写或全部小写:

    #include <cctype>
    #include <algorithm>
    #include <string>
    
    std::string test_string("mR BroWn");
    std::transform(test_string.begin(), test_string.end(),
                   test_string.begin(),
                   std::tolower);
    

    接下来我会检查异常或使用等效表。如果有问题的字符在异常字符数组中,则使用等价表。

    【讨论】:

      【解决方案3】:

      在过去,我使用 stricoll 对名称进行排序,它比较当前语言环境下的字符串。虽然这适用于当前语言环境中的字符串,但当您处理来自同一数据库中不同语言环境的名称时,这不起作用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-12-07
        • 2011-02-10
        • 2011-07-30
        • 2011-07-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多