首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >排序字符*与特殊(德语)字符?

排序字符*与特殊(德语)字符?
EN

Stack Overflow用户
提问于 2010-10-31 20:37:43
回答 2查看 1.1K关注 0票数 2

我遇到的问题是,我需要对一大堆字符指针进行排序,但是它们有特殊的字符。我设法得到了这样的排序程序:

代码语言:javascript
复制
std::sort(dict_.begin(), dict_.end(), comp);

bool comp(NumPair& a, NumPair& b)
{
    return boost::lexicographic_compare(a.pFirst, b.pFirst);
}

这很有效,除了所有特殊的德语字符都排在其他字符之前。我的老师(是的,这是关于家庭作业的),然而,希望他们在最后排序。太棒了!

所以我在玩,我想我可以用我在网站上看到的一个技巧,让一个地区的地方包括这样的特殊人物。

代码语言:javascript
复制
return boost::lexicographic_compare(a.pFirst, b.pFirst, locale("german"));

没起作用!所以:

代码语言:javascript
复制
bool comp()
{
    setlocale(LC_ALL, "");
    return boost::lexicographic_compare(a.pFirst, b.pFirst);
}

没起作用!

如果你有,我很想听听其他一些可能有效的想法。

更新:

根据要求,一些样本输入和输出:

代码语言:javascript
复制
// Some entries
dict_.push_back( NumPair ( "öffnen", "to open" ) );
dict_.push_back( NumPair ( "überraschen", "to surprise" ) );
dict_.push_back( NumPair ( "wünschen", "to wish, to desire, to want" ) );
dict_.push_back( NumPair ( "widersprechen", "to contradict_" ) );

// NumPair ctor.
NumPair( const char *pFirst, const char *pSecond )
{
    /* Deep copy of pFirst and pSecond */
}

结果后的产出:

代码语言:javascript
复制
öffnen
überraschen
wünschen
widersprechen
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-10-31 20:55:08

您可能想要显示更多的代码,比如您使用的字符串会导致这个问题。我很容易就能对一组德语单词进行排序,任何以非ASCII特殊德语字符开头的单词都会在末尾排序。即使没有任何特殊的德语区域设置,也会发生这种情况,因为在Unicode中,非ASCII字符的代码点值高于ASCII字符。

例如:

代码语言:javascript
复制
setlocale(LC_ALL, "");

std::vector<std::wstring> vec;
vec.push_back(L"Hallo");
vec.push_back(L"Morgen");
vec.push_back(L"Zebra");
vec.push_back(L"Abend");
vec.push_back(L"Übertragens");
vec.push_back(L"Buchen");

std::sort(vec.begin(), vec.end());
for (std::vector<std::wstring>::iterator it = vec.begin(); it != vec.end(); ++it)
    std::wcout << *it << std::endl;

这一产出如下:

代码语言:javascript
复制
Abend
Buchen
Hallo
Morgen
Zebra
Übertragens

注意宽字符串的使用。由于词汇表比较例程逐字符比较,所以您需要使用宽字符,否则比较函数将最终逐字节比较字符串,而不是逐字符进行比较。这将导致无效的比较,因为并不是每个Unicode字符都可以存储在一个字节中。例如,特殊的德文字符是UTF-8中的2个字节,因此您需要一个数据类型,能够在单个元素中包含0x00到0xFFFF的范围。在大多数平台上,wchar_t就足够了。

(还请注意,在源代码中包含非ASCII字符并不是一个好做法。使用“通用字符代码”代替。我只是在这里使用非ASCII源代码来澄清。)

票数 3
EN

Stack Overflow用户

发布于 2010-10-31 21:50:31

如果您使用windows,我建议您使用CompareString函数。http://msdn.microsoft.com/en-us/library/dd317759

地区很容易出错。此外,如果使用区域设置,则线程会引发问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4064984

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档