【问题标题】:What std::locale names are available on common windows compilers?常见的 Windows 编译器上有哪些 std::locale 名称?
【发布时间】:2011-05-23 08:32:52
【问题描述】:

该标准几乎没有说明什么是有效的语言环境名称;只有传递无效的语言环境名称会导致std::runtime_error。在 MSVC、MinGW 和 ICC 等常见 Windows 编译器上可以使用哪些语言环境名称?

【问题讨论】:

    标签: c++ windows locale


    【解决方案1】:

    好的,C 和 C++ 语言环境之间存在差异。

    让我们开始吧:

    • MSVC C++ std::locale 和 C setlocale

      接受语言环境名称为“Language[_Country][.Codepage]”,例如“English_United States.1251”,否则会抛出异常。注意:代码页不能是 65001/UTF-8,并且应该与此语言环境的 ANSI 代码页一致(或直接省略)

    • Vista 和 7 中的 MSVC C++ std::locale 和 C setlocale 应该接受语言环境 [Language][-Script][-Country] 像“en-US”使用 ISO-631 语言代码和 ISO 3166 区域和脚本名称。

      我在 Windows 7 上使用 Visual Studio 对其进行了测试 - 它不起作用。

    • MinGW C++ std::locale 接受 "C" 和 "POSIX" 它不支持其他语言环境, 实际上 gcc 仅在 GNU C 库上支持语言环境 - 基本上仅在 Linux 下。

      setlocale 是原生 Windows API 调用,所以应该支持我上面提到的所有内容。

      与其他 C++ 库一起使用时,它可能支持更广泛的语言环境 比如 Apache stdcxx 或 STL Port。

    • ICC - 我没有测试它,但它取决于它使用的标准 C++ 库。为了 Linux 下的示例它使用 GCC 的 libstdc++,因此它支持所有语言环境 gcc 支持。我不知道它在 Windows 下使用的是什么标准 C++ 库。

    如果你想拥有“编译器和平台”独立的语言环境支持(实际上 更好的支持)看看 Boost.Locale

    阿尔乔姆

    【讨论】:

    • +1 并且很有趣——不幸的是,ICU 库(提议的 boost::locale 依赖于它)对于我工作的大多数应用程序来说非常昂贵(就二进制大小而言)。 :(
    • @Billy ONeal 您不必使用 ICU,Boost.Locale 还提供标准库和基于 Win32 API 的后端,允许您对不同的编译器使用相同的命名约定(即 en_US.UTF-8)就像在 Posix 系统上一样。
    • 奖励这个答案,因为它最直接地回答了我最初提出的问题。
    【解决方案2】:

    相信您需要的信息是here

    locale  "lang[_country_region[.code_page]]"
                | ".code_page"
                | ""
                | NULL
    

    此页面提供以下链接:


    虽然我的回答涵盖setlocale 而不是std::locale,但this MSDN page 似乎暗示格式确实相同:

    类语言环境的对象也存储 作为类对象的语言环境名称 细绳。使用无效的语言环境名称 构造一个语言环境方面或一个 语言环境对象抛出一个对象 类runtime_error。存储的 如果语言环境,语言环境名称为“*” 对象不能确定一个 C 风格的语言环境完全对应于 对象所代表的那个。 否则,您可以在标准 C 中建立匹配的语言环境 库,对于语言环境对象 loc,由 打电话给setlocale(LC_ALL, loc.name.c_str)

    另请参阅this pagethis thread,它们往往表明std::locale 在内部使用setlocale

    【讨论】:

    • gcc 不支持std::locale 中的“Windows 风格”语言环境名称,它仅支持 POSIX 和 C 语言环境。
    • @Artyom:我在这个答案中没有看到任何关于 gcc 的信息。
    • @Billy ONeal 我只是与问题有关,而不是与答案有关。因此,std::locale 通常在 Windows 上支持这一点是不正确的,而是似乎只有 MSVC 支持这样的语言环境名称。
    • 这个答案得到了复选标记,因为它对我目前的工作最有用。
    【解决方案3】:

    这是一个几乎可以在任何地方使用的语言环境名称:""。也就是空字符串。这与您可能默认获得的 "C" 语言环境形成对比。作为std::setlocale() 的参数的空字符串意味着类似于“使用用户或环境设置的首选语言环境”。如果你使用它,缺点是你的程序不会在所有地方都有相同的输出。好处是您的用户可能会认为它按他们想要的方式工作。

    【讨论】:

      猜你喜欢
      • 2015-02-21
      • 2016-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-31
      • 2017-09-15
      • 1970-01-01
      相关资源
      最近更新 更多