标准对于什么是有效的语言环境名称几乎没有任何规定; 只有通过一个无效的区域设置名称导致std::runtime_error
。 常见的Windows编译器(如MSVC,MinGW和ICC)上可以使用哪些语言环境名称?
我相信你需要的信息在这里 :
locale "lang[_country_region[.code_page]]" | ".code_page" | "" | NULL
此页面提供了以下链接:
虽然我的答案涵盖了setlocale
而不是std::locale
,但是这个MSDN页面似乎意味着格式确实是相同的:
类语言环境的对象还将语言环境名称存储为类字符串的对象。 使用无效的语言环境名称来构造语言环境构面或语言环境对象将引发类
runtime_error
的对象。 如果语言环境对象无法确定C样式的语言环境与对象表示的语言环境完全对应,则存储的语言环境名称为“*”。 否则,可以通过调用setlocale(LC_ALL, loc.name.c_str)
在标准C库中为locale对象loc建立匹配的语言环境 。
也看到这个页面和这个线程倾向于显示std::locale
内部使用setlocale
。
好的,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应接受使用ISO-631语言代码和ISO 3166区域和脚本名称的“en-US”语言环境[语言] [ – 脚本] [ – 国家/地区]。
我在Windows 7上用Visual Studio测试过 – 它不起作用。
MinGW的C ++ std :: locale接受“C”和“POSIX”它不支持其他语言环境,实际上gcc只支持GNU C库的语言环境 – 基本上只在Linux下。
setlocale是本地的Windows API调用,所以应该支持上面提到的所有内容。
与其他C ++库(如Apache stdcxx或STL端口)一起使用时,它可能支持更广泛的语言环境。
ICC – 我没有测试过,但是它依赖于它使用的标准C ++库。 例如在Linux下,它使用GCC的libstdc ++,所以它支持gcc所支持的所有语言环境。 我不知道它在Windows下使用什么标准的C ++库。
如果你想拥有“编译器和平台”独立的语言环境支持(实际上更好的支持)看看Boost.Locale
阿尔乔姆
这里有一个可以在任何地方使用的语言环境名称: ""
。 那就是空的字符串。 这与您可能默认获取的"C"
语言环境形成鲜明对比。 作为std::setlocale()
的参数的空字符串表示类似于“使用用户或环境设置的首选语言环境”。 如果你使用它,缺点是你的程序在任何地方都不会有相同的输出。 好处是你的用户可能会认为它按照他们想要的方式工作。