【问题标题】:What does __STDC_ISO_10646__ exactly mean?__STDC_ISO_10646__ 到底是什么意思?
【发布时间】:2012-09-17 09:38:28
【问题描述】:

我很难从我的 C++ 标准副本中理解宏 __STDC_ISO_10646__:

__STDC_ISO_10646__

yyyymmL 形式的整数常量(例如,199712L)。如果 此符号已定义,则需要 Unicode 中的每个字符 set,当存储在 wchar_t 类型的对象中时,具有与 该字符的短标识符。 Unicode 必需集 由 ISO/IEC 10646 定义的所有字符组成, 连同指定的所有修正和技术勘误 年和月。

据我了解,这意味着您系统上的 wchar_t 将代表一个 unicode 代码点。它是否正确?如果是这种情况,那么 utf-8 和 utf-16 编码将不符合要求,而 utf-32 将符合要求,对吗?另外,还有哪些其他字符编码符合?

【问题讨论】:

  • 我对其他字符集的了解还不够多,但为什么 UTF-32 不符合?
  • @hvd:我认为我对 utf-32 的看法是错误的,你是对的,utf-32 会符合要求。

标签: c++ unicode


【解决方案1】:

宏与存储在 wchar_t 中的 unicode 字符的值相关。

更具体地说,随着对标准的修改,ISO/IEC 10646 标准支持更多字符。

您可以将年份和月份定义为宏的值意味着当您将 Unicode 字符存储到 wchar_t 变量时,将存储在该变量中的 unicode 字符的值将是在给定的年份和月份生效。

请参阅此处[http://www.unicode.org/charts/][1] 以获取 Unicode 短标识符的参考

希望对你有帮助

左撇子

【讨论】:

  • 我通常会等待其他人回答。你知道是否可以用 16 位 wchar_t 定义宏吗?
  • 这是维基百科关于宽字符link 的摘录。C 编程语言的标准库包括许多处理宽字符和由它们组成的字符串的工具。宽字符使用数据类型 wchar_t 定义,由于历史兼容性原因,在原始 C90 标准中将其定义为 16 位值。符合 10646-1:2000 Unicode 标准的 C 和 C++ 编译器通常采用 32 位值。
  • 来自同一个链接... 但是,ISO/IEC 10646:2003 Unicode 标准 4.0 说:“ANSI/ISO C 将宽字符集的语义留给特定实现,但要求可移植 C 执行集中的字符对应于它们的等价的宽字符,扩展名为 0。"
  • @Lefteris “在最初的 C90 标准中被定义为 16 位值”——C 一直允许实现 CHAR_BIT 等于例如 9 或 64,所以 @987654325 @ 永远不能被要求正好是 16 位。维基百科不是一个可靠的来源。它的任何参考文献都支持这种说法吗?
  • 维基百科的好处是可以编辑。已编辑。
【解决方案2】:

您引用的标准部分(第 16.8 节预定义宏名称 [cpp.predefined])为一系列定义添加前缀:

¶2 以下宏名称由实现有条件地定义:

也就是说如果实现不能满足要求(例如因为wchar_t是16位类型),那么实现就不会定义__STDC_ISO_10646__。

另一方面,如果wchar_t 是32 位或更大的类型,那么实现很可能能够定义宏。 ISO 10646 只需要 21 位来表示所有字符,但对于(几乎)所有实际用途,这意味着 16 位 wchar_t 太小而 32 位 wchar_t 足够大。这也意味着从头开始的实现很可能使wchar_t 成为 32 位类型。如果预先存在的实现在此选项标准化之前选择了 16 位 wchar_t,则可能会因向后兼容性而受阻。

【讨论】:

  • ISO 10646 是否总是需要 21 位?我想也许早期版本只有 16 位,所以理论上一个实现可以支持早期版本的 ISO 10646。
  • 否; ISO 10646 并不总是需要 21 位。在上个千年的某个时候,它只需要现在 BMP(基本多语言平面)的 16 位。但是在当前的千禧年中,它始终需要 21 位(AFAICR - 由指定版本号和发布日期的人进行更正)。然而,一些编译器已经存在了足够长的时间,以至于为了向后兼容而不得不保留它们在 1990 年代行为的某些特性(例如sizeof(wchar_t))。
  • AFAICT, Unicode V2.0 从 1996 年开始将字符代码的范围扩大到 21 位。
  • 你说得对,引用自here: starting with Unicode 2.0 (July, 1996), it has not been a 16-bit encoding. 尽管似乎在 ISO 10646-2 (2001) 中添加了补充平面(BMP 之外的字符)。谢谢。
  • 我的理解是 ISO 10646(或至少它的前身尝试 ISO 通用字符集)需要 31 位,并且它的排列与 Unicode 完全不兼容。但是,我认为 ISO曾经 没有 16 位 UCS。与 Unicode 的争论点之一是 16 位太小了,我很确定,当 UCS 和 Unicode 解决它们的差异并基本上合并时,人们同意字符集大于16 位。
猜你喜欢
  • 2017-08-07
  • 2017-07-20
  • 2014-09-23
  • 2014-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多