__STDC_ISO_10646__是什么意思?

4
我很难理解C ++标准中的宏__STDC_ISO_10646__的含义:
__STDC_ISO_10646__
一个形如yyyymmL的整数常量(例如199712L)。如果定义了此符号,则在存储于wchar_t类型的对象中时,Unicode所需集合中的每个字符都具有与该字符的短标识符相同的值。 Unicode所需集合包括ISO / IEC 10646定义的所有字符以及指定年份和月份的所有修正案和技术勘误。
据我理解,这意味着在您的系统上,wchar_t将表示一个Unicode代码点。这是正确的吗?如果是这种情况,则utf-8和utf-16编码将不符合规范,而utf-32会符合规范。还有哪些字符编码是符合规范的?

我对其他字符集不了解,但为什么UTF-32不符合规范呢? - user743382
@hvd: 我觉得我对 UTF-32 的看法是错误的,你是正确的,UTF-32 是符合规范的。 - Jesse Good
2个回答

4
您引用的标准部分是§16.8预定义宏名称[cpp.predefined],其中包含以下说明:
“¶2实现有条件地定义了以下宏名称:”
这意味着如果实现无法满足要求(例如因为是16位类型),则实现将不会定义<__STDC_ISO_10646__>。
另一方面,如果是32位或更大的类型,则实现很可能能够定义该宏。 ISO 10646只需要21位来表示所有字符,但对于(几乎)所有实际目的而言,这意味着16位的太小,而32位的已经足够大。 这也意味着从头开始实现的实现很可能会将变成32位类型。 如果先前的实现在此选项标准化之前选择了16位的,则可能会受到向后兼容性的限制。

ISO 10646是否总是需要21位?我认为早期版本可能只有16位,因此理论上实现可以支持ISO 10646的早期版本。 - Jesse Good
1
不,ISO 10646并非总是需要21位。在上个千年的某个时候,它只需要现在所称的BMP(基本多语言平面)的16位。但在当前千年,它一直需要21位(AFAICR-可能会因版本号和发布日期而有所更正)。然而,一些编译器已经存在了足够长的时间,以至于它们在1990年代的某些行为特征(例如sizeof(wchar_t))必须保留以实现向后兼容性。 - Jonathan Leffler
据我所知,Unicode V2.0于1996年将字符编码范围扩展到了21位。 - Jonathan Leffler
1
你是对的,引用自这里:“从Unicode 2.0(1996年7月)开始,它不再是一个16位编码。”虽然补充平面(BMP之外的字符)在ISO 10646-2(2001年)中被添加了进来。谢谢。 - Jesse Good
我的理解是,ISO 10646(或者至少它的前身——ISO通用字符集的尝试)需要31位,并且它的排列与Unicode完全不兼容。然而,我认为ISO从来没有一个16位的UCS。Unicode争议的一个焦点是16位太小了,我很确定,在UCS和Unicode解决分歧并基本合并的时候,已经同意字符集将大于16位。 - R.. GitHub STOP HELPING ICE

1

宏与Unicode字符的值相关,当该字符存储在wchar_t中时。

更具体地说,ISO/IEC 10646标准支持更多的字符,随着标准的修订而增加。

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

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

希望这有所帮助

Lefteris


我通常会等待其他人回答。您知道是否可以使用16位的wchar_t来定义宏吗? - Jesse Good
这是维基百科关于宽字符的摘录链接。C编程语言的标准库包括许多处理宽字符和由它们组成的字符串的工具。宽字符使用数据类型wchar_t定义,在最初的C90标准中,由于历史兼容性原因,它被定义为16位值。符合10646-1:2000 Unicode标准的C和C++编译器通常假定32位值。 - Lefteris
从同一个链接...然而,ISO/IEC 10646:2003 Unicode标准4.0指出:“ANSI/ISO C将宽字符集的语义留给特定实现,但要求可移植C执行集中的字符通过零扩展对应于它们的宽字符等效项。” - Lefteris
@Lefteris “在最初的C90标准中被定义为16位值” - C语言一直允许实现CHAR_BIT等于9或64,因此wchar_t从未被要求精确地为16位。维基百科不是可信的来源。它的任何参考资料都支持这个说法吗? - user743382
@JesseGood 看了这里提供的glibc手册(http://www.gnu.org/software/libc/manual/html_node/Extended-Char-Intro.html#Extended-Char-Intro),我读到了以下内容:“ISO C90标准引入了wchar_t,但并未对其表示方式做出具体规定。它只要求该类型能够存储基本字符集中的所有元素。[...]但在GNU C库中,wchar_t始终为32位宽,因此能够表示所有UCS-4值,并覆盖ISO 10646的所有内容。[...]” - Lefteris
2
维基百科的好处在于它可以被编辑。编辑。 - Cubbi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接