What std::locale names are available on common windows compilers?

后端 未结 3 704
我在风中等你
我在风中等你 2020-11-30 03:22

The standard is pretty much silent on what constitutes a valid locale name; only that passing an invalid locale name results in std::runtime_error. What locale

相关标签:
3条回答
  • 2020-11-30 03:47

    Here's one locale name that's usable pretty much anywhere: "". That is, the empty string. The is in contrast to the "C" locale that you are probably getting by default. The empty string as an argument to std::setlocale() means something like "Use the preferred locale set by the user or environment." If you use this, the downside is that your program won't have the same output everywhere; the upside is that your users might think it works just the way they want.

    0 讨论(0)
  • 2020-11-30 03:59

    I believe the information you need is here :

    locale  "lang[_country_region[.code_page]]"
                | ".code_page"
                | ""
                | NULL
    

    This page provides links to :

    • Language Strings
    • Country/Region String
    • Code Pages

    Although my answers covers setlocale instead of std::locale, this MSDN page seems to imply that the format is indeed the same :

    An object of class locale also stores a locale name as an object of class string. Using an invalid locale name to construct a locale facet or a locale object throws an object of class runtime_error. The stored locale name is "*" if the locale object cannot be certain that a C-style locale corresponds exactly to that represented by the object. Otherwise, you can establish a matching locale within the Standard C Library, for the locale object loc, by calling setlocale(LC_ALL, loc.name.c_str).

    Also see this page and this thread which tend to show that std::locale internally uses setlocale.

    0 讨论(0)
  • 2020-11-30 03:59

    Ok, there is a difference between C and C++ locales.

    Let's start:

    • MSVC C++ std::locale and C setlocale

      Accepts locale names as "Language[_Country][.Codepage]" for example "English_United States.1251" Otherwise would throws. Note: codepage can't be 65001/UTF-8 and should be consistent with ANSI codepage for this locale (or just omitted)

    • MSVC C++ std::locale and C setlocale in Vista and 7 should accept locales [Language][-Script][-Country] like "en-US" using ISO-631 language codes and ISO 3166 regions and script names.

      I tested it with Visual Studio on Windows 7 - it does not work.

    • MinGW C++ std::locale accepts "C" and "POSIX" it does not support other locales, actually gcc supports locales only over GNU C library - basically only under Linux.

      setlocale is native Windows API call so should support all I mentioned above.

      It may support wider range of locales when used with alternative C++ libraries like Apache stdcxx or STL Port.

    • ICC - I hadn't tested it but it depends on the standard C++ library it uses. For example under Linux it used GCC's libstdc++ so it supports all the locales gcc supports. I don't know what standard C++ library it uses under Windows.

    If you want to have "compiler and platform" independent locales support (and actually much better support) take a look on Boost.Locale

    Artyom

    0 讨论(0)
提交回复
热议问题