2013-02-12 104 views
1

我正在测试一些新的locale由C++ 11提供的东西,如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语言环境遵循相同的格式,但与两个字母xx_XX.UTF-8(例如es_ES.UTF-8),而在Ideone上尝试代码时,似乎接受的唯一语言环境是en_US.UTF-8

最令人沮丧的是,试图得到支持的语言环境的标准,跨平台的表,最好的一个,我发现谷歌搜索以防万一是this one列出的语言环境为Windows和其等同于无视窗,但缺乏很多国家(如美国,危地马拉,墨西哥......)。

我试过的另一件事是调试一步一步的std::locale构造函数,希望找到一段代码,说什么区域设置名称是有效的,其中一个不是。我期待着大量的语言环境名称(例如示例代码中的一个),但我被构造函数的复杂性所吓倒并逃离了。

所以我的问题是:

  • 至极的是,你知道和使用的跨平台语言环境的最好,最完整的表?
  • 如何知道正在运行的系统支持的区域设置?如何访问受支持的语言环境列表?

额外的问题:

  • 为什么语言环境名称不规范(授予跨平台的源代码)?
  • Ideone使用了哪些语言环境系统?

谢谢。

回答

2

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

从本质上讲,这意味着你不能在编译时知道语言环境列表,因为它是目标系统的运行时功能。