2011-01-06 13 views
1

Ich habe eine Klasse, die ich verwenden, um meine Zeichenfolge, bool Paar Vektor zu sortieren. Meine Strings sind utf-8-codiert. Ich mag sie sortieren, so dass, wenn die Gebietsschema der Person zum Beispiel festgelegt, Französisch, würde ich das hoffen, wenn der Benutzer getippt:Hilfe mit der Verwendung von std :: locale?

zap 
    apple 
    école 
    blue 
    erable 

Dass es wäre zu klären zu sein:

apple 
blue 
école 
erable 
zap 

Meine std :: locale Klasse ist dies:

class AguiLBLocaleCompare : 
    public std::binary_function<std::pair<std::string, bool>, 
    std::pair<std::string,bool>, bool> { 
protected: 
    const std::collate<char> &coll; 
public: 
    AguiLBLocaleCompare(std::locale loc) 
     : coll(std::use_facet<std::collate<char> >(loc)) {} 
    bool operator()(const std::pair<std::string, bool> &a, 
     const std::pair<std::string, bool> &b) const { 
     // std::collate::compare() takes C-style string (begin, end)s and 
     // returns values like strcmp or strcoll. Compare to 0 for results 
     // expected for a less<>-style comparator. 
     return coll.compare(a.first.c_str(), a.first.c_str() + a.first.size(), 
      b.first.c_str(), b.first.c_str() + b.first.size()) < 0; 
    } 
}; 

und dann Methode mein Artikel Sortierung ist:

void AguiListBox::sort() 
{ 
    if(!isReverseSorted()) 
     std::sort(items.begin(),items.end(),AguiLBLocaleCompare(WHAT_DO_I_PUT_HERE)); 
    else 
     std::sort(items.rbegin(),items.rend(),AguiLBLocaleCompare(WHAT_DO_I_PUT_HERE)); 
} 

Also ich bin mir nicht sicher, was ich in den Konstruktor setzen soll, um den gewünschten Effekt zu erzielen.

Ich versuchte std::locale(), aber es sortiert die Akzente nach dem Z in Zap, die nicht was ich will.

Artikel ist ein

std::vector<std::pair<std::string, bool>> 

Dank

+0

Auf welcher Plattform befinden Sie sich? C++ - Gebietsschemaunterstützung ist notorisch lückenhaft. –

+0

Ich bin auf Windows 7 – jmasterx

+0

Syntaktisch können Sie jedes Gebietsschema dort, z. 'std :: locale :: locale (" fr_FR.utf8 ")' aber ich habe keine Ahnung, welche Länder Windows zur Verfügung hat oder was ihre C++ Locale-Namen sind. –

Antwort

1

Ich glaube nicht, VC++ unterstützt UTF-8-Locales. Sie sollten wahrscheinlich convert bis wstring verwenden und collate<wchar_t> verwenden oder zu einer C++ - Bibliothek wechseln, die UTF-8-Sprachumgebungen unterstützt.

Gebietsschema-Namen unter Windows/VC++ sind anders als unter UNIX; siehe Language and Country/Region Strings (CRT) auf MSDN.

Verwandte Themen