#include #include #include #include void try_c_locale(const char* locale_name) { if( std::setlocale(LC_ALL, locale_name) == NULL ) printf("Failed to setlocale(LC_ALL, \"%s\")\n", locale_name); else printf("Succeeded in calling setlocale(LC_ALL, \"%s\")\n", locale_name); } void try_cpp_locale(const char* locale_name) { try { std::locale my_locale(locale_name); } catch(std::exception& e) { printf("Failed ctor for std::locale with \"%s\": %s\n", locale_name, e.what()); return; } printf("Succeeded ctor for std::locale with \"%s\"\n", locale_name); } int main(void) { // Some locales from "locale -a" on my OS X system, here is proof // that these locales do exist on my system. Take my word for it // that "locale -a" also shows these locales existing on my linux // system as well. // // rutski@imac:~$ locale -a | tail -n 2 // C // POSIX // rutski@imac:~$ locale -a | grep en_US // en_US // en_US.ISO8859-1 // en_US.ISO8859-15 // en_US.US-ASCII // en_US.UTF-8 // rutski@imac:~$ locale -a | grep pl_PL // pl_PL // pl_PL.ISO8859-2 // pl_PL.UTF-8 // rutski@imac:~$ const char* test_locales[] = { "C", "POSIX", "en_US", "en_US.UTF-8", "pl_PL", "pl_PL.ISO8859-2" }; printf("Trying c locales...\n"); for(size_t x = 0; x < sizeof(test_locales)/sizeof(char*); x++) try_c_locale(test_locales[x]); printf("\n"); printf("Trying C++ locales...\n"); for(size_t x = 0; x < sizeof(test_locales)/sizeof(char*); x++) try_cpp_locale(test_locales[x]); }