跨平台的语言环境表

时间:2013-02-12 14:54:01

标签: c++ formatting cross-platform locale

我正在测试C ++ 11提供的一些新的locale内容,如std::put_money,以便习惯它们的使用。我认为,对于标准库支持的所有国家/地区,显示大量印刷货币会很好:

const char *Locales[] =
{
    "English_Australia.1252",
    "en_EN",
    "fr_FR.UTF-8"
    / ...
    // lots of lots of worldwide locales
};

int main(int argc, char **argv)
{
    for (const char **Locale = std::begin(Locales); Locale != std::end(Locales); ++Locale)
    {
        std::stringstream ss;
        ss.imbue(std::locale(*Locale))

        std::cout << *Locale << ' '
                  << std::showbase << std::put_money(11223344556677889900) << '\n';
    }
}

当我意识到区域设置名称根本不是标准时,我感到震惊,对于Windows 7 Professional(SP1)(西班牙语语言环境机器)下的Visual Studio 10.0,区域设置名称遵循格式Language_Region.charsetID,例如: English_Australia.1252,在我的Linux机器(Debian 4.2.2)中使用gcc 4.2.3,locales遵循相同的格式,但有两个字母xx_XX.UTF-8(例如es_ES.UTF-8)并且在尝试代码时Ideone似乎唯一接受的语言环境是en_US.UTF-8

最令人沮丧的部分是尝试获得支持的语言环境的标准,跨平台表,我发现Googling arround的最佳名称是this one,它列出了Windows的语言环境及其在中的等价物没有Windows ,但缺少很多国家(如美国,危地马拉,墨西哥......)。

我尝试过的另一件事是逐步调试std::locale构造函数,希望找到一段代码,说明哪个区域名称有效,哪一个不是。我期待一个巨大的语言环境名称数组(如示例代码中的te),但我对std::locale构造函数的复杂性感到害怕并逃之夭夭。

所以我的问题是:

  • 您知道并使用的是最佳且最完整的跨平台语言环境表吗?
  • 如何知道正在运行的系统支持的语言环境?如何访问支持的语言环境列表?

额外问题:

  • 为什么区域设置名称不是标准的(授予跨平台源代码)?
  • Ideone使用了哪种语言环境系统?

感谢。

1 个答案:

答案 0 :(得分:2)

在UNIX-y系统上,您可以通过locale -a运行man setlocale来获取区域设置列表,这也是/usr/lib/locale推荐的。我不认为C库甚至有一个语言环境列表,因为它在{{1}}的运行时查找它们。

实质上,这意味着您无法在编译时知道语言环境列表,因为它是目标系统的运行时功能。