4

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

__STDC_ISO_10646__

yyyymmL 形式的整数常量(例如,199712L)。如果定义了此符号,则 Unicode 所需集中的每个字符在存储在 wchar_t 类型的对象中时,都具有与该字符的短标识符相同的值。Unicode 要求集包含 ISO/IEC 10646 定义的所有字符,以及指定年份和月份的所有修订和技术勘误。

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

4

2 回答 2

4

您引用的标准部分(第 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 位类型。如果预先存在的实现wchar_t在此选项标准化之前选择了 16 位,则可能会因向后兼容性而受阻。

于 2012-09-25T20:21:26.583 回答
1

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

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

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

[http://www.unicode.org/charts/][1]有关Unicode 短标识符的参考,请参见此处

希望这可以帮助

左撇子

于 2012-09-25T20:35:38.253 回答