常见的Windows编译器上有哪些std :: locale名称?

时间:2010-12-10 08:19:22

标签: c++ windows locale

标准对构成有效区域设置名称的内容几乎保持沉默;仅传递无效的区域设置名称会导致std::runtime_error。哪些语言环境名称可用于常见的Windows编译器,如MSVC,MinGW和ICC?

3 个答案:

答案 0 :(得分:23)

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

让我们开始吧:

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

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

  • Vista和7中的MSVC C ++ std :: locale和C setlocale应该接受语言环境 [语言] [ - 脚本] [ - 国家]像“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 :(得分:20)

我相信您需要的信息是here

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

此页面提供以下链接:


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

  

类语言环境的对象也存储   区域设置名称作为类的对象   串。使用无效的区域设置名称   构建一个locale facet或a   locale对象抛出一个对象   班runtime_error。存储的   如果是语言环境,则语言环境名称为“*”   对象无法确定a   C风格的语言环境完全对应于   由对象表示的。   否则,您可以在标准C中建立匹配的区域设置   库,对于语言环境对象loc,由   致电setlocale(LC_ALL, loc.name.c_str)

另请参阅this pagethis thread,这些信息往往表明std::locale内部使用setlocale

答案 2 :(得分:10)

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