【问题标题】:Cross-platform table of locales跨平台语言环境表
【发布时间】:2013-02-12 14:54:00
【问题描述】:

我正在测试 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 例如:@987654326 @,在我的带有 gcc 4.2.3 的 Linux 机器(Debian 4.2.2)中,语言环境遵循相同的格式,但带有两个字母 xx_XX.UTF-8(例如 es_ES.UTF-8),并且在 Ideone 上尝试代码时,似乎接受的唯一语言环境是en_US.UTF-8

最令人沮丧的部分是尝试获得一个标准的、跨平台的受支持语言环境表,我在谷歌上找到的最好的一个是this one,它列出了 Windows 的语言环境及其在 no- 中的等价物Windows,但缺少很多国家/地区(例如美国、危地马拉、墨西哥...)。

我尝试过的另一件事是逐步调试std::locale 构造函数,希望能找到一段代码,说明哪个语言环境名称有效,哪个无效。我期待一大堆语言环境名称(如示例代码中的那个),但我被 std::locale 构造函数的复杂性吓坏了,然后逃走了。

所以我的问题是:

  • 您了解和使用的跨平台语言环境最好、最完整的表格是哪一个?
  • 如何知道运行系统支持的语言环境?如何访问支持的语言环境列表?

补充问题:

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

【问题讨论】:

    标签: c++ formatting cross-platform locale


    【解决方案1】:

    在 UNIX-y 系统上,您可以通过运行 locale -a 来获取语言环境列表,man setlocale 也建议这样做。我认为 C 库甚至没有语言环境列表,因为它在运行时在 /usr/lib/locale 中查找它们。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-27
      • 2019-04-27
      • 1970-01-01
      • 2021-03-09
      • 2016-12-06
      • 2012-04-21
      • 2011-01-25
      • 2012-05-23
      相关资源
      最近更新 更多