c++ - 跨平台区域设置表

标签 c++ formatting cross-platform locale

我正在测试一些新的 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 的区域设置以及非 Windows 中的等效区域设置,但缺少很多国家/地区(例如美国、危地马拉、墨西哥...)。

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

所以我的问题是:

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

其他问题:

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

最佳答案

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

本质上,这意味着您无法在编译时知道区域设置列表,因为它是目标系统的运行时功能。

关于c++ - 跨平台区域设置表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14835307/

相关文章:

c++ - 返回第 n 个斐波那契数的快速递归函数

c++ - 使用Cmake构建PCL教程时如何处理 'Policy CMP0074 is not set'警告?

java - 哪个双值参数使 String.format 结果成为星号

c++ - 快速跨平台 C/C++ 散列库

c++ - 是否有带 C++ 编译器但不带 64 位整数的平台?

java - 使用 JComboBox 在 JEditorPane 中设置所选文本的字体大小

c++ - 调用线程会在 thread.join() 之后看到对局部变量的修改吗?

c++ - 什么是 'delete' 'new' 数据/对象的安全方法?

ios - SwiftUI 中的 NumberFormatter - 使用未解析的标识符 'formatter'

java - 使用 printf 处理多种格式