在 C++ 中对字符串数组进行排序,无论是“A”还是“a”以及 å、ä ö?

Posted

技术标签:

【中文标题】在 C++ 中对字符串数组进行排序,无论是“A”还是“a”以及 å、ä ö?【英文标题】:Sorting a string array in C++ no matter of 'A' or 'a' and with å, ä ö? 【发布时间】: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;   
    

【问题讨论】:

【参考方案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 对名称进行排序,它比较当前语言环境下的字符串。虽然这适用于当前语言环境中的字符串,但当您处理来自同一数据库中不同语言环境的名称时,这不起作用。

【讨论】:

以上是关于在 C++ 中对字符串数组进行排序,无论是“A”还是“a”以及 å、ä ö?的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中对结构数组进行排序

在 C# 中对整数三元组数组进行排序

在 awk 中对哈希/数组进行排序

如何在 C++ 中对以下字符串序列进行排序?

如何使用一些静态值在javascript中对数组进行排序?

在 C++ 中对向量进行分组排序