__STDC_ISO_10646__ 的可能取值

13
以下是可能的__STDC_ISO_10646__宏的取值范围:ISO 10646的各个版本对应不同的Unicode版本,维基百科上有版本列表,但仅包含年份而非月份,该宏包括月份值。 编辑:由于有些人完全未能理解实际问题。我要求一个特定数字列表,该宏可以采用这些数字作为其值,并且每个数字对应的ISO 10646版本。

http://www.unicode.org/history/publicationdates.html有一个Unicode版本发布日期列表,但我不确定它是否与ISO-10646“以及所有修正案和技术勘误”相关。 - rici
@R..:表格中的日期是Unicode发布日期。但该表还显示了哪个Unicode版本包含在哪个ISO 10646版本中。不知道的是,__STDC_ISO_10646__是否指定ISO发布日期或Unicode发布日期。我更好奇的是为什么你需要担心__STDC_ISO_10646__的值,因为它的主要目的是通知wchar_t的大小是否足够大以容纳Unicode代码点,而是否定义了__STDC_ISO_10646__处理这一问题。在我看来,__STDC_ISO_10646__的值是次要的关注点。 - Remy Lebeau
1
@R.. 或许没有一个明确的列表。已知的是,在创建定义此宏的头文件的日期时,该库与该点上的标准是最新的。这可能实际上与任何特定的标准发布不符。如果标准在2014年1月发布,并且我在2月发布了一个库,我可以指定201402L作为有效值。在4月份,我再次发布库并(假设没有更新Unicode)指定201404L。 - Neil
1
http://std.dkuug.dk/JTC1/SC2/WG2/docs/projects - ninjalj
@Neil 只是因为__意味着实现定义,并不意味着编译器设置的值没有限制。设置错误值(与UNICODE分辨率的正确日期不对应的值)的实现是错误的。 - Alice
显示剩余9条评论
5个回答

8

查看ISO/IEC JTC1/SC2(编码字符集)/WG2(通用编码字符集)的报告,这些报告可以在http://std.dkuug.dk/JTC1/SC2/WG2/docs/projects上找到,并与http://babelstone.blogspot.com.es/2007/06/unicode-and-isoiec-10646.html进行交叉核对,可以编制出初步的出版日期列表。有些日期可能会有偏差,特别是那些只有月份和年份(没有日期)的目标日期。

  • 1993-05-01 ISO/IEC 10646-1:1993
  • 1996-03-01 ISO/IEC 10646-1:1993 TC1
  • 1996-10-15 ISO/IEC 10646-1:1993 Amd.1 (UTF-16)
  • 1996-10-15 ISO/IEC 10646-1:1993 Amd.2 (UTF-8)
  • 1996-10-15 ISO/IEC 10646-1:1993 Amd.3 (控制字符:C0,C1的编码位置)
  • 1996-10-15 ISO/IEC 10646-1:1993 Amd.4 (删除UTF-1)
  • 1997-11-15 ISO/IEC 10646-1:1993 Amd.6 (藏文)
  • 1997-11-15 ISO/IEC 10646-1:1993 Amd.7 (33个附加字符)
  • 1997-12-15 ISO/IEC 10646-1:1993 Amd.8 (CJK表意文字新附录)
  • 1997-12-15 ISO/IEC 10646-1:1993 Amd.9 (字符标识符)
  • 1998-05-15 ISO/IEC 10646-1:1993 Amd.5 (韩文音节)
  • 1998-07-15 ISO/IEC 10646-1:1993 TC2
  • 1998-07-15 ISO/IEC 10646-1:1993 Amd.11 (加拿大土著音节文字统一码)
  • 1998-09 ISO/IEC 10646-1:1993 TC3
  • 1998-09-01 ISO/IEC 10646-1:1993 Amd.12 (切罗基文)
  • 1998-10-01 ISO/IEC 10646-1:1993 Amd.10 (吉兹语)
  • 1998-10-15 ISO/IEC 10646-1:1993 Amd.13 (CJK统一表意符号)
  • 1998-11-01 ISO/IEC 10646-1:1993 Amd.16 (盲文图案)
  • 1998-11-01 ISO/IEC 10646-1:1993 Amd.19 (古北欧文字)
  • 1998-11-01 ISO/IEC 10646-1:1993 Amd.20 (欧甘文)
  • 1999-05-15 ISO/IEC 10646-1:1993 Amd.23 (注音符号扩展和其他字符)
  • 1999-06-01 ISO/IEC 10646-1:1993 Amd.21 (僧伽罗文)
  • 1999-07-15 ISO/IEC 10646-1:1993 Amd.17 (CJK统一表意符号扩展A)
  • 1999-07-15 ISO/IEC 10646-1:1993 Amd.18 (符号和其他字符)
  • 1999-10 ISO/IEC 10646-1:1993 Amd.14 (彝文音节和彝文字根)
  • 1999-10 ISO/IEC 10646-1:199
    根据之前的列表,ISO C标准(199712L)中的示例将对应于ISO/IEC 10646-1:1993 + Amendments 1-4,6-9,而glibc的200009L将对应于ISO/IEC 10646-1:2000。 ISO C标准中的示例位于修正案5之前,该修正案移动并重新组织了Hangul块,这是一种不兼容的更改,有时被称为“韩国混乱”,在UTF-8 RFC和其他地方明确提到。
    为了完整起见,以下是Unicode和ISO 10646之间的对应关系,编译自http://www.unicode.org/history/publicationdates.html上的数据:
    • 1991-10 Unicode 1.0.0
    • 1992-06 Unicode 1.0.1
    • 1993-06 Unicode 1.1 ISO/IEC 10646-1:1993
    • 1996-07 Unicode 2.0 ISO/IEC 10646-1:1993 + Amendments 5-7
    • 1998-05 Unicode 2.1 ISO/IEC 10646-1:1993 + Amendments 5-7 + 2 characters from Amendment 18 (Euro sign + Object Replacement Character (U+FFFC))
    • 1999-09 Unicode 3.0 ISO/IEC 10646-1:2000
    • 2001-03 Unicode 3.1 ISO/IEC 10646-1:2000 + ISO/IEC 10646-2:2001
    • 2002-03 Unicode 3.2 ISO/IEC 10646-1:2000 + Amendment 1 + ISO/IEC 10646-2:2001
    • 2003-04 Unicode 4.0 ISO/IEC 10646:2003
    • 2005-03 Unicode 4.1 ISO/IEC 10646:2003 + Amendment 1
    • 2006-07 Unicode 5.0 ISO/IEC 10646:2003 + Amendments 1-2 + 4 characters from Amendment 3 (Devanagari letters GGA, JJA, DDDA, BBA)
    • 2008-04 Unicode 5.1 ISO/IEC 10646:2003 + Amendments 1-4
    • 2009-10 Unicode 5.2 ISO/IEC 10646:2003 + Amendments 1-6
    • 2010-10 Unicode 6.0 ISO/IEC 10646:2011 + Indian Rupee sign
    • 2012-01 Unicode 6.1 ISO/IEC 10646:2012
    • 2012-09 Unicode 6.2 ISO/IEC 10646:2012 + Turkish Lira sign (included in Amd.1)
    • 2013-09 Unicode 6.3 ISO/IEC 10646:2012 + Turkish Lira sign + Bidirectional Isolates (LRI, RLI, FSI, PDI) + Arabic Letter MARK (ALM) (included in Amd.2)
    • 2014-06 Unicode 7.0 ISO/IEC 10646:2012 + Amendments 1-2 + Ruble sign (to be included in ISO/IEC 10646:2014)
    Unicode曾经对字符属性进行过几次不兼容的更改(ISO/IEC 10646未涵盖这些更改)。其中一些在Cherokee supplement提案RFC6452(Unicode 6.0用于应用程序的Unicode代码点和国际化域名(IDNA))中提到:
    • Unicode 3.0.0: U+01AA(拉丁字母反转ESH LOOP)、U+01BE(带斜杠的倒置喉塞音拉丁字母)、U+01BF(拉丁字母WYNN)、U+03F3(希腊字母YOT)将它们的通用类别Lo更改为Ll
    • Unicode 3.0.0: U+04C0(西里尔字母PALOCHKA)将其通用类别Lo更改为Lu
    • Unicode 4.1.0: U+A015(彝语音节WU)将其通用类别Lo更改为Lm
    • Unicode 5.0.0: U+10341(哥特字母NINETY)将其通用类别Lo更改为Nl
    • Unicode 6.0:U+0CF1(卡纳达语符号JIHVAMULIYA)、U+0CF2(卡纳达语符号UPADHMANIYA)将它们的通用类别So更改为Lo
    • Unicode 6.0:U+19DA(新傣文数字一)将其通用类别Nd更改为No
    • 切罗基提案本身建议将现有的切罗基字符从Lo更改为Ll
    Unicode稳定性政策详见http://www.unicode.org/policies/stability_policy.html。特别地,对于Unicode 2.0及以上版本,一旦字符被编码,它将不会移动或删除,并且其名称也不会更改;对于Unicode 5.0及以上版本,一旦为字符分配了命名字符序列和正式别名,它们也不会被更改或删除。

考虑到这个答案所付出的努力,我认为它现在是赏金问题的明显候选者。稍后我会仔细阅读答案,但现在先谢谢! - R.. GitHub STOP HELPING ICE

3
根据当前UNICODE出版日期,以下值是可能的(且最具体):
  • 199110L
  • 199206L
  • 199306L
  • 199507L
  • 199607L
  • 199805L
  • 199808L
  • 199812L
  • 199904L
  • 199909L
  • 200009L
  • 200103L
  • 200203L
  • 200304L
  • 200503L
  • 200607L
  • 200803L
  • 200910L
  • 201201L
  • 201209L
  • 201309L
  • 201406L
然而,注意C(和C++)只有几个标准:89,90,95,99,03(C++)和11(未来有14个临时标准)。宽字符直到95年才出现!
这意味着只有少数这些值会被合理地遇到;在我的(相当)最新系统上(gcc版本4.6.3),我得到了200009L。

1
除非我错了,不过ISO的出版日期似乎有些不同/延迟了... - R.. GitHub STOP HELPING ICE
@R.. 没关系。他们不是根据实际出版日期工作的,而是根据正式确定的日期。这是相当标准的惯例。 - Alice
1
@Alice:他们是谁?“正式化”是什么意思? - Nisse Engström

2

6.10.8 预定义宏名称2

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


是的,但可能的值是什么?标准文本中只有一个示例值,我找不到其他可能值的任何数据。 - R.. GitHub STOP HELPING ICE
ISO的更新日期使得编译器实现者能够遵守编译器发布的要求。 - BLUEPIXY
1
@R.. 我理解这个答案是“可以是任何日期”。没有人说它是ISO/IEC 10646发布或修订的日期。你是在要求所有ISO/IEC 10646发布以及所有修正和技术勘误发布的清单吗? - Werner Henze
@WernerHenze:也许你的评论是在指出我的误解。我提问的意图是想知道这些“边界值”对应的发布月份,但我错误地认为该值需要等于其中一个,而不是本质上意味着“当时最新”。 - R.. GitHub STOP HELPING ICE
1
@WernerHenze 无法将其解释为“可以是任何日期”;它明确指出“根据ISO / IEC 10646定义,以及所有修订版”,如果没有特定日期上的修订版、技术勘误等,则不能是该日期。很简单。 - Alice
显示剩余5条评论

2
这个问题没有终极答案,因为可能会发布更多版本的标准。
此外,权威的临时答案是198瑞士法郎,并受版权保护。

这些内容当然不是免费的,但确切的发布日期应该是。那个页面上的“阶段: 90.92(2012-11-21)”是否是官方的发布日期?如果是,那就提供了一种获取答案的方式。 - R.. GitHub STOP HELPING ICE
1/ 抱歉把这个作为答案。我是新来的,没有足够的积分来评论问题。2/ 我不太确定日期是否为官方日期,但我认为是这样。3/ 另外,我不知道ISO网站是否提供标准版本的完整列表。4/ 据我所记,ISO标准印刷品中有修订历史记录。此外,ISO标准可能会被撤销。目前尚不清楚该宏的可能值会发生什么变化。 - Jakub
1
这个问题确实有一个最终答案;他正在询问它可能取哪些值(现在进行时),而不是它将来可能取哪些值。仅仅因为标准将来可能会扩展并不意味着当前只有一组固定的值可以取。我们生活在当下,而不是无限的未来。 - Alice
毫无疑问,您通常希望您的代码是免维护的。显然,这只能在一定程度上成功。我的观点是,您无法摆脱对ISO活动的依赖,这相当不愉快。应该正确处理宏的意外值。 - Jakub
@R..:90.92阶段表示“待修订的国际标准”。10646:2012标准的日期为2012年6月1日,我认为这是出版日期,但目前处于90.92阶段,日期为2012年11月21日。 - Nisse Engström
@user3768029 我并不特别认为这很有吸引力;我希望我的代码是无错的,但实际上很少如此。此外,这也不会引入维护问题;所有日期都将在未来变得更大(显然),因此您只需说大于您需要支持的日期即可。缺乏对未来日期的了解绝不会导致维护问题;根据定义,您无法针对未来更新进行编程。 - Alice

1

由于不同的库版本可能会有所不同,因此没有确定的列表。

如果您的代码必须依赖于特定版本的Unicode(比如1997年),那么您必须考虑到可能没有1997年版本可用,但可能有1998年版本可用,如果库不支持您想要的版本,则需要优雅地失败。

最后,问题就变成了:

if(__STDC_ISO_10646__ % 199700)
{
}
else if(__STDC_ISO_10646__ & 199800)
{
}

不正确;该宏被定义为固定在规范的发布日期上。它与库无关;任何给出规范定义的日期以外的日期的库都是无效的。 - Alice
@Alice:你如何查找10646标准早期版本的发布日期? - Nisse Engström
@Alice:你怎么知道这个宏指的是10646标准的出版年月?如果它指的是C库发布时生效的10646标准版本,那该怎么办呢?是否有缺陷报告来澄清这个问题? - Nisse Engström
@NisseEngström "STDC_ISO_10646"是一个整数常量,格式为yyyymmL(例如199712L)。如果定义了此符号,则在以wchar_t类型的对象存储时,Unicode所需集中的每个字符具有该字符的短标识符相同的值。 Unicode所需集包括ISO / IEC 10646定义的所有字符以及指定年份和月份的所有修正和技术勘误。如果使用其他编码,则不应定义该宏,并且实际使用的编码是实现定义的。 - TofuBeer

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