2014-12-23 4 views
9

Mein Programm prüft auf Großbuchstaben in deutscher Sprache.Alle std :: locale Namen drucken (Windows)

#include <iostream> 
#include <boost/algorithm/string/classification.hpp> 
#include <boost/locale.hpp> 

using namespace std; 

int main() 
{ 
    locale::global(locale("Germany_german")); 
    //locale::global(locale("de_DE.UTF-8")); //Also tried "de_DE.UTF-8", but does not work 

    string str1 = "über"; 
    cout << boolalpha << any_of(str1.begin(), str1.end(), boost::algorithm::is_upper()) << endl; 

    string str2 = "Ää"; 
    cout << boolalpha << any_of(str2.begin(), str2.end(), boost::algorithm::is_upper()) << endl; 

    return 0; 
} 

Programm stürzt mit Fehlern auf Konsole

terminate called after throwing an instance of 'std::runtime_error' 
    what(): locale::facet::_S_create_c_locale name not valid 

Ich weiß nicht, was das genaue locale String, "de_DE.UTF-8" nicht so gut funktionieren.

Gibt es eine Möglichkeit, genaue Locale-Namenszeichenfolgen für alle Gebietsschemas zu erhalten, die vom Betriebssystem unterstützt werden. Vielleicht gibt es eine Liste irgendwo in den Header-Dateien, aber ich sehe nichts <locale> Header.

+0

Sie können 'locale -a' in einer Befehlszeile ausführen. – 0x499602D2

+0

Ich bin auf Windows – user1

+0

"de-DE" und "German_Germany" sollte funktionieren. Zumindest sollten Sie in der Lage sein, 'locale' aus diesen Strings zu konstruieren. –

Antwort

16

Ich schrieb ein Programm zum Drucken aller unterstützten Locale-Namen.

#include <Windows.h> 

#include <iostream> 
#include <string> 
#include <vector> 
#include <algorithm> 
#include <ostream> 
#include <iterator> 

using namespace std; 

vector<wstring> locals; 

BOOL CALLBACK MyFuncLocaleEx(LPWSTR pStr, DWORD dwFlags, LPARAM lparam) 
{ 
    locals.push_back(pStr); 
    return TRUE; 
} 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    EnumSystemLocalesEx(MyFuncLocaleEx, LOCALE_ALL, NULL, NULL); 

    for (vector<wstring>::const_iterator str = locals.begin(); str != locals.end(); ++str) 
     wcout << *str << endl; 

    wcout << "Total " << locals.size() << " locals found." << endl; 

    return 0; 
} 

Funktioniert gut.

... 
de 
de-AT 
de-CH 
de-DE 
de-DE_phoneb 
de-LI 
de-LU 
...  
Total 429 locals found. 
+2

Dies sieht aus wie ein ziemlich nützliches Codeschnipsel. Vielen Dank für Ihre Antwort – sehe

Verwandte Themen