在 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”以及 å、ä ö?的主要内容,如果未能解决你的问题,请参考以下文章