标准对构成有效区域设置名称的内容几乎保持沉默;仅传递无效的区域设置名称会导致std::runtime_error
。哪些语言环境名称可用于常见的Windows编译器,如MSVC,MinGW和ICC?
答案 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 page和this thread,这些信息往往表明std::locale
内部使用setlocale
。
答案 2 :(得分:10)
这是一个几乎可以在任何地方使用的语言环境名称:""
。也就是说,空字符串。这与默认情况下您可能获得的"C"
语言环境形成对比。空字符串作为std::setlocale()
的参数意味着“使用用户或环境设置的首选语言环境”。如果你使用它,缺点是你的程序在任何地方都不会有相同的输出;好处是你的用户可能认为它的工作方式正常。