【发布时间】:2011-05-23 08:32:52
【问题描述】:
该标准几乎没有说明什么是有效的语言环境名称;只有传递无效的语言环境名称会导致std::runtime_error。在 MSVC、MinGW 和 ICC 等常见 Windows 编译器上可以使用哪些语言环境名称?
【问题讨论】:
该标准几乎没有说明什么是有效的语言环境名称;只有传递无效的语言环境名称会导致std::runtime_error。在 MSVC、MinGW 和 ICC 等常见 Windows 编译器上可以使用哪些语言环境名称?
【问题讨论】:
好的,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
阿尔乔姆
【讨论】:
boost::locale 依赖于它)对于我工作的大多数应用程序来说非常昂贵(就二进制大小而言)。 :(
相信您需要的信息是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 page 和this thread,它们往往表明std::locale 在内部使用setlocale。
【讨论】:
std::locale 中的“Windows 风格”语言环境名称,它仅支持 POSIX 和 C 语言环境。
gcc 的信息。
std::locale 通常在 Windows 上支持这一点是不正确的,而是似乎只有 MSVC 支持这样的语言环境名称。
这是一个几乎可以在任何地方使用的语言环境名称:""。也就是空字符串。这与您可能默认获得的 "C" 语言环境形成对比。作为std::setlocale() 的参数的空字符串意味着类似于“使用用户或环境设置的首选语言环境”。如果你使用它,缺点是你的程序不会在所有地方都有相同的输出。好处是您的用户可能会认为它按他们想要的方式工作。
【讨论】: