排序字符*特殊(德国)字符?

时间:2010-10-31 20:37:44

标签: c++ locale

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

std::sort(dict_.begin(), dict_.end(), comp);

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

这很好用,除了所有特殊的德国字符在所有其他字符之前排序。我的老师(是的,这与家庭作业有关),但是,希望他们在最后排序。真棒!

所以我一直在玩,并认为我可以使用我在网站上看到的技巧,使区域区域设置包含特殊字符,如此

return boost::lexicographic_compare(a.pFirst, b.pFirst, locale("german"));

没用!所以:

bool comp()
{
    setlocale(LC_ALL, "");
    return boost::lexicographic_compare(a.pFirst, b.pFirst);
}

没用!

如果你有它们,我很乐意听到一些其他可能有用的想法。

更新

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

// 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 */
}

结果后输出:

öffnen
überraschen
wünschen
widersprechen

2 个答案:

答案 0 :(得分:3)

您可能希望显示更多代码,例如您正在使用哪些字符串导致此问题。我可以轻松地对一组德语单词进行排序,并且在结尾处排序以非ASCII特殊德语字符开头的任何单词。即使没有任何特殊的德语区域设置,也会发生这种情况,因为在Unicode中,非ASCII字符的码点值高于ASCII字符。

例如:

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;

输出:

Abend
Buchen
Hallo
Morgen
Zebra
Übertragens

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

(另请注意,在源代码中包含非ASCII字符不是一个好习惯。请改用“通用字符代码”。为了清楚起见,我只是在这里使用非ASCII源。)

答案 1 :(得分:1)

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

语言环境非常容易出错。此外,如果您使用区域设置,则线程会导致问题。