C++ 标准是否强制要求对 wchar_t 进行编码?

2024-03-08

以下是我的 2014 年标准草案 N4140 副本的一些摘录

22.5 标准代码转换方面 [locale.stdcvt]

3 对于三个代码转换方面中的每一个codecvt_utf8, codecvt_utf16, and codecvt_utf8_utf16:
(3.1)——Elem是宽字符类型,例如wchar_t, char16_t, or char32_t.

4 对于面codecvt_utf8:
(4.1) — 构面应在 UTF-8 多字节序列和 UCS2 或 UCS4 之间进行转换(取决于Elem)在程序内。

对这两段的一种解释是wchar_t必须编码为 UCS2 或 UCS4。我不太喜欢它,因为如果这是真的,我们就将语言的一个重要属性深埋在库描述中。我试图找到对该属性的更直接的表述,但无济于事。

另一种解释是wchar_t编码不需要是 UCS2 或 UCS4,并且在不是 UCS2 或 UCS4 的实现中,codecvt_utf8不会为wchar_t。我也不太喜欢这种解释,因为如果这是真的,而且两者都不是char nor wchar_t本机编码是 Unicode,似乎没有办法在这些本机编码和 Unicode 之间进行可移植的转换。

这两种解释哪一个是正确的?还有一个我忽略的吗?

澄清我不是在询问有关适用性的一般意见wchar_t用于软件开发或属性wchar_t一个人可以从其他地方获得。我有兴趣在这两个具体段落中标准的。我试图理解什么这些具体段落包含或不包含。

澄清2。如果 4.1 表示“facet 应在 UTF-8 多字节序列和 UCS2 或 UCS4 之间进行转换或当前全局语言环境对 wchar_t 施加的任何编码“ 不会有问题。事实并非如此。它说的是它所说的。看来如果有人使用std::codecvt_utf8<wchar_t>,最终得到一堆wchar_t编码为 UCS2 或 UCS4,无论当前的全局区域设置如何。 (无法指定区域设置或任何字符转换方面codecvt_utf8)。因此,问题可以这样重新表述:转换结果是否可直接用于当前全局语言环境(和/或任何可能的语言环境)进行输出,wctype查询等等?如果没有的话有什么用for? (如果上面的第二种解释是正确的,那么答案似乎是“什么也没有”)。


wchar_t只是一个完整的文字。它有最小值、最大值等。

它的尺寸没有由标准固定。

如果足够大,您可以将 UCS-2 或 UCS-4 数据存储在以下缓冲区中wchar_t。无论您使用什么系统,都是如此,因为 UCS-2 和 UCS-4 以及 UTF-16 和 UTF-32 只是按序列排列的整数值的描述。

在C++11中,有std假设数据具有这些编码,则读取或写入数据的 API。在 C++03 中,存在使用当前语言环境读取或写入数据的 API。

22.5 标准代码转换方面 [locale.stdcvt]

3 对于三个代码转换方面 codecvt_utf8、codecvt_utf16 和 codecvt_utf8_utf16 中的每一个:

(3.1) — Elem 是宽字符类型,例如 wchar_t、char16_t 或 char32_t。

4 对于方面 codecvt_utf8:

(4.1) — 方面应在程序内的 UTF-8 多字节序列和 UCS2 或 UCS4(取决于 Elem 的大小)之间进行转换。

所以在这里codecvt_utf8_utf16处理utf8一侧为 UCS2 或 UCS4(取决于 Elem 的大小),另一侧为 UCS2 或 UCS4。它进行转换。

Elem(宽字符)被假定为 UCS2 或 UCS4 编码,具体取决于它的大小。

这并不意味着wchar_t是这样编码的,它只是意味着这个操作解释了wchar_t被如此编码.

UCS2 或 UCS4 如何进入 Elem 并不是这部分标准所关心的。也许你用十六进制常量将其设置在那里。也许你是从 io 上读到的。也许你是即时计算出来的。也许您使用了高质量的随机数生成器。也许您将一个的位值加在一起ascii细绳。也许您计算了一个定点近似值log*月球将地球日改变 1 秒所需的秒数。不是这些段落的问题。这些段落只是规定了如何修改和解释位。

类似的主张在其他情况下也成立。这并不强制要求什么格式wchar_t有。它只是说明了这些方面如何解释wchar_t or char16_t or char32_t or char8_t(阅读或写作)。

其他互动方式wchar_t使用不同的方法来规定值的大小wchar_t被解释。

iswalpha http://en.cppreference.com/w/cpp/string/wide/iswalpha使用(全局)区域设置来解释wchar_t, 例如。在一些当地人看来,wchar_t可能是UCS2。在其他情况下,它可能是一些疯狂的邪神编码,其细节使您能够从太空中看到新的颜色。

明确地说:编码不是数据或位的属性。编码是以下属性数据解释。很多时候只有一个proper or 合理的对数据进行任何有意义的解释,但数据本身就是位。

C++ 标准不强制要求存储在 a 中的内容wchar_t。它确实规定了某些操作对内容的解释wchar_t成为。该部分描述了某些方面如何解释数据wchar_t.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 标准是否强制要求对 wchar_t 进行编码? 的相关文章

随机推荐

  • 如何获取 ntile() 的间隔

    我试图弄清楚是否有一种方法可以获取用于何时的间隔ntile 用来 我有一个样本 我想将其用作获取较大样本的百分位值的基础 并且我希望找到一种方法来获取使用时的间隔值ntile 对此的任何启发将不胜感激 我真的很想把这个作为评论 但我仍然无法
  • 手动删除 anaconda python 中 pkgs 文件夹中的所有文件是否安全?

    我运行这个命令来释放 anaconda 上的磁盘空间 conda clean all 但是 仍然有一些大文件残留在pkgsanaconda python 中的文件夹 手动删除其中的所有文件是否安全pkgs文件夹 有破坏我的 anaconda
  • Invoke-Restmethod:如何获取返回码?

    有没有办法在调用时将返回码存储在某处Invoke RestMethod在 PowerShell 中 我的代码如下所示 url http www dictionaryapi com api v1 references collegiate x
  • 如何从字符串中获取size_t?

    我需要从用户输入中获取数组大小 对我来说 将输入存储为很自然size t 但是正在寻找合适的strto 功能我找不到 我刚用过strtoull since unsigned long long保证至少是 64 位 而且我无论如何都使用 C9
  • 可变值和不可变值重定义有什么区别?

    我读到 F 中的值是不可变的 然而 我也遇到了重新定义价值定义的概念 它掩盖了以前的定义 这与可变值有何不同 我问这不仅是一个理论构造 而且还询问是否有关于何时使用可变值以及何时重新定义表达式的建议 或者如果有人可以指出后者不是惯用的 f
  • 如何让 GNU Unifont 或 Free Mono 在 gvim windows 上运行?

    我正在尝试在 Windows 7 上的 gvim 中获得对符文字符的支持 我的 Fonts 目录中安装了 Free Mono 和 GNU Unifont 字体 都支持此范围 但它们没有出现在字体菜单中 gvim 给出了我收到以下行的无效字体
  • ASP.NET MVC 4 引用单父实体的多个外键

    我正在尝试开发一个 ASP NET MVC 4 应用程序 可以根据玩家的进攻 防守和助攻技能对他们进行评级 进攻 防守和助攻是球员表上的外键 引用相同的查找表 评分 我有以下父实体 public class Rating public in
  • 为什么 tzset() 在 Mac OS X 上 fork 后速度变慢了?

    Calling tzset fork之后显得很慢 如果我第一次打电话 我只会看到缓慢的情况tzset 在 fork 之前在父进程中 我的TZ环境变量未设置 我dtruss我的测试程序显示子进程读取 etc localtime对于每一个tzs
  • 如何将按钮对齐到屏幕中间?

    我正在尝试在屏幕中间放置 2 个按钮 然而 这些按钮与我现在拥有的代码重叠 实际上我并没有使用那么多 CSS 所以这可能是一个新手问题 这是我的html wrapper text align center button position a
  • 使用 AVMutableComposition 缝合(合并)视频时修复方向

    TLDR 查看编辑 我正在 Swift 中创建一个测试应用程序 我想使用以下命令将应用程序文档目录中的多个视频拼接在一起AVMutableComposition 我在某种程度上成功地做到了这一点 我的所有视频都拼 接在一起 并且所有内容都显
  • HTTP 请求损坏

    在接收大量流量的网站上 一小部分请求是这样的 http cheezburger com ScriptResource axd d zaVpgH63ePt90pn br br p a src ScriptResource axd d zaVp
  • TFS 与 JIRA/Bamboo/SVN [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何在 us-central1 以外的网络区域使用 httpsCallable

    我部署了一个云函数 如下所示 export const publishVersion functions region europe west2 https onCall async data context gt 然后在我的网络客户端中
  • Golang - ToUpper() 在单个字节上?

    我有一个 byte b 我想选择一个字节 b pos 并将其更改为大写 然后小写 bytestype 有一个方法叫做ToUpper 我如何将其用于单个字节 Calling ToUpper在单字节上 OneOfOne 给出了最有效的 调用数千
  • 柯里化有什么好处?

    我认为我不太理解柯里化 因为我看不到它可以提供任何巨大的好处 也许有人可以用一个例子来启发我 证明它为什么如此有用 它真的有好处和应用吗 还是只是一个被过度重视的概念 两者之间有细微差别currying and 部分应用 尽管它们密切相关
  • BigQuery 分区表在 _PARTITIONTIME 上联接

    有两个分区表 都带有伪列 PARTITIONTIME 我想在 PARTITIONTIME 上加入它们 然后我想使用 PARTITIONTIME 过滤器查询结果表 但我注意到该过滤器仅传播到 JOIN 语句的第一个表 下面是一个例子 WITH
  • 如何在 Sublime Text 2 中解析来自 TypeScript 的错误消息?

    我正在尝试为 TypeScript 设置 Sublime Text 2 构建系统 我已按照我找到的指示进行操作here https stackoverflow com questions 12779631 how to configure
  • 问题 如何使 C# 的 VS IDE 设计器失效/刷新?

    I have 定制表格继承自Form它实现了一个名为的布尔属性Prop 我将使用的表单将继承自定制表格 此属性将对表单进行一些绘制和更改 如果已启用 但是 这并没有按预期工作 设计的 VS IDE 没有刷新以显示更改 但是 如果我按 Ctr
  • 使用 boost::asio::ip::tcp::iostream 的低带宽性能

    我写了一个小测试程序 使用boost asio ip tcp iostream传输约 38 MiB 的数据 include
  • C++ 标准是否强制要求对 wchar_t 进行编码?

    以下是我的 2014 年标准草案 N4140 副本的一些摘录 22 5 标准代码转换方面 locale stdcvt 3 对于三个代码转换方面中的每一个codecvt utf8 codecvt utf16 and codecvt utf8