我正在测试 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 的语言环境遵循相同的格式,但带有两个字母xx_XX.UTF-8
(例如es_ES.UTF-8
),并且在 Ideone 上尝试代码时,似乎唯一接受的语言环境是en_US.UTF-8
.
最令人沮丧的部分是尝试获得一个标准的、跨平台的受支持语言环境表,我在谷歌搜索中发现的最好的一个是列出 Windows 的语言环境及其在no-Windows中的等价物,但缺乏很多国家(如美国、危地马拉、墨西哥......)。
我尝试过的另一件事是逐步调试std::locale
构造函数,希望能找到一段代码,说明哪个语言环境名称有效,哪个无效。我期待一个巨大的语言环境名称数组(如示例代码中的那个),但我被std::locale
构造函数的复杂性吓坏了并逃跑了。
所以我的问题是:
- 您知道和使用的最好和最完整的跨平台语言环境表是哪一个?
- 如何知道正在运行的系统支持的语言环境?如何访问支持的语言环境列表?
额外问题:
- 为什么语言环境名称不标准(授予跨平台源代码)?
- Ideone 使用哪种语言环境系统?