【问题标题】:Creating an std::locale with an empty string ""使用空字符串 "" 创建 std::locale
【发布时间】:2017-09-22 12:16:20
【问题描述】:

问题

是否使用空字符串构造std::locale 以使用户首选的本地语言环境成为标准的一部分?如果是,您能否指出一个明确说明的来源?

问题描述

std::locale 文档中的示例有这一行:

std::wcout << "User-preferred locale setting is " << std::locale("").name().c_str()

这暗示使用空字符串创建语言环境将返回用户首选的本地语言环境。快速谷歌搜索后,这个article 还提到:

空字符串告诉 setlocale 使用由 环境中的用户。

但是,在查看 documentationstd::locale 构造函数时,没有提到提供空字符串时的特殊情况。

这是报价:

3-4) 使用指定的 std_name 构造系统语言环境的副本 (例如“C”或“POSIX”或“en_US.UTF-8”或“English_US.1251”),如果 操作系统支持此类语言环境。语言环境 以这种方式构造有一个名字。

【问题讨论】:

  • [locale.cons]/6 有备注:有效字符串参数值的集合是“C”、“”和任何实现定义的值。。仍然没有找到使用"" 应该做什么。

标签: c++ locale std


【解决方案1】:

draft standard[locale.cons] 中说:

explicit locale(const char* std_name);
  1. 效果: 使用标准 C 语言环境名称构造一个语言环境,例如 "POSIX"。生成的语言环境实现定义为与该名称关联的语义。

  2. 抛出: runtime_error 如果参数无效或为空。

  3. 备注: 有效的字符串参数值集是 "C""" 和任何实现定义的值。

这表示"" 是一个有效的构造函数参数,而参数是标准的 C 语言环境名称。

然后在 [c.locale] 中明确引用标准 C 标头 &lt;locale.h&gt;

引用自 C 标准 (C99),7.11.1.1/3

locale 的值 "C" 指定 C 翻译的最小环境; locale 的值 "" 指定特定于语言环境的本地环境。其他实现定义的字符串可以作为第二个参数传递给setlocale

我认为这意味着您的问题的答案是“是”:"" 的名称指的是本地语言环境。

【讨论】:

  • 看起来那样。我还能够找到 [facets.examples]/4 cin.imbue(locale("")); // the user’s preferred locale
  • 请注意,即使"" 在有效字符串参数集中,我也看到std::locale("") 引发异常(来自在Mac 上的LibreOffice 下运行的plugin
猜你喜欢
  • 2014-09-13
  • 2011-06-04
  • 1970-01-01
  • 2020-01-15
  • 2013-11-29
  • 2017-09-15
  • 2020-02-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多