【发布时间】:2016-12-10 18:34:36
【问题描述】:
以下是我的 2014 年标准草案 N4140 副本的一些节选
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) — facet 应在程序中在 UTF-8 多字节序列和 UCS2 或 UCS4(取决于Elem的大小)之间转换。
对这两段的一种解释是wchar_t 必须编码为 UCS2 或 UCS4。我不太喜欢它,因为如果它是真的,那么我们在库描述中就隐藏着语言的一个重要属性。我试图找到这个属性的更直接的陈述,但无济于事。
另一种解释是 wchar_t 编码不需要是 UCS2 或 UCS4,并且在不是的实现中,codecvt_utf8 不适用于 wchar_t。我也不太喜欢这种解释,因为如果它是真的,而且 char 和 wchar_t 原生编码都不是 Unicode,那么似乎没有办法在这些原生编码和 Unicode 之间进行可移植的转换。
这两种解释中哪一种是正确的?还有一个是我忽略的吗?
澄清我不是在询问关于wchar_t 是否适合软件开发的一般意见,或者wchar_t 的属性可以从其他地方获得。我对标准的这两个特定段落感兴趣。我试图了解这些特定段落包含或不包含什么。
说明 2。如果 4.1 说“方面应在 UTF-8 多字节序列和 UCS2 或 UCS4 或当前全局语言环境对 wchar_t 施加的任何编码之间进行转换”,就不会有问题。它没有。它说它说什么。看来,如果使用std::codecvt_utf8<wchar_t>,则不管当前的全局语言环境如何,最终都会得到一堆编码为UCS2 或UCS4 的wchar_t。 (无法为codecvt_utf8 指定语言环境或任何字符转换方面)。所以这个问题可以改写成这样:转换结果是否可以直接与当前的全局语言环境(和/或任何可能的语言环境)一起用于输出、wctype 查询等等?如果没有,它对 有什么用处? (如果上面的第二种解释是正确的,答案似乎是“没有”)。
【问题讨论】:
-
wchar_t 是不可移植的。例如,在 Unix 上是 UTF-32,在 Windows 上是 UTF-16(不是 UCS2)
-
wchar_t是一个整数类型。是什么让您认为它具有固定编码?它可以存储数字7,您可以将其解释为“用户单击了左侧按钮”。在其他地方,您可以将7中的wchar_T解释为“激活火警”,在其他地方解释为小写a。有趣的问题是当您从输入等中读取时会发生什么,但这不是wchar_t的编码,而是 io 所做的编码......方面描述 使用该方面的编码结果是什么关于流式操作... -
wchar_t必须大于char,就是这样.. -
wchar_t只是能够包含UCS2或UCS4,它不是强制到的。 -
一个编码是从数字到意义的分配。类型不具备这样的语义。