[统一码] 技术报告
 

Unicode®标准附件#31

Unicode标识符和语法

版本 Unicode 15.1.0码
编辑 马克·戴维斯(mark@unicode.org)和罗宾·勒罗伊(eggrobin@unicode.org)
日期 2023-09-01
此版本 https://www.unicode.org/reports/tr31/tr31-39.html
上一版本 https://www.unicode.org/reports/tr31/tr31-37.html
最新版本 https://www.unicode.org/reports/tr31/
最新建议更新 https://www.unicode.org/reports/tr31/proposed.html
修订 39

总结

本附录描述了推荐默认值的规范用于在通用标识符、不可变标识符、哈希标记标识符和基于模式的语法。它还提供了使用使用标识符进行规范化。

状态

本文档已由Unicode成员和其他相关方,并已由Unicode联盟。这是一个稳定的文档,可以用作参考资料或被其他人引用为规范性参考规范。

Unicode标准附件(UAX)构成不可分割的一部分Unicode标准,但以单独的形式在线发布文件。Unicode标准可能要求符合标准Unicode标准附件中的内容,如果在该版本Unicode标准的一致性章节。这个UAX文档的版本号对应于它是Unicode标准的一部分。

请在网上提交更正和其他意见报告表格[反馈].有助于理解本附件的相关信息如下见Unicode标准附录#41,“通用Unicode标准附件参考。”对于的最新版本Unicode标准,请参见[Unicode码]. 对于当前Unicode技术报告列表,请参见[报告]. 更多信息有关Unicode标准版本的信息,请参阅[版本]. 对于任何可能适用于本附件的勘误表,见[勘误表].

目录


1介绍

Unicode标准实施者面临的一个常见任务是为标识符提供解析和/或词法分析引擎,例如编程语言变量或域名。还有一些领域需要使用扩展的字符以更好地与最终用户的期望对齐,例如哈希标签。

协助以Unicode标准处理标识符基于字符的解析器和词法分析器,一组规范作为解析包含Unicode字符的标识符的基础。这些规范包括:

这些指南遵循标识符的典型模式通用编程语言中的语法规则,通过定义ID_Start类和ID_Continue类,并使用简单的BNF规则基于这些类别的标识符;然而类更复杂,并且包含其他类型的字符,由于Unicode标准的通用范围。

本附件还提供了标准化和标识符不区分大小写,扩展到最初在Unicode标准附件#15“Unicode规范化表格”[UAX15型].

计算机语言的词汇分析也与词汇有关除标识符之外的元素,并带有空格和换行符将它们分开。本附件为在标识符之外具有这种词汇意义的字符。

本附录中的规范提供了标识符的定义保证向后兼容每个连续的发布Unicode,但也允许任何合适的新Unicode标识符中可用的字符。此外,Unicode提供了稳定模式语法的字符属性。这个结果模式语法向后兼容向前地与Unicode标准的未来版本兼容。这些属性可以单独使用,也可以与标识符字符。

图1显示了定义的代码点的不相交类别在本附件中。(盒子的尺寸不按比例。)

图1。代码标识符分析的点类别

ID_启动
字符
模式_语法
字符
未分配代码点数
ID_未启动
字符
图案_白色_空格
字符
其他已分配
代码点数

由以下项的并集组成的集合ID_启动ID_未启动字符称为标识符字符并拥有财产ID_继续. TheID_未启动集合定义为设定差ID_继续ID_启动:它是不是正式的Unicode属性。虽然词汇规则传统上是用后者表示,这里的讨论被简化了通过引用不相交的类别。

1.1稳定性

开发人员可以依赖某些功能稳定性:

在Unicode的后续版本中从上述类别之一到另一类别的字符如下所示带有加号(+)表1。

表1。被允许未来版本中的更改

  ID_启动 ID_未启动 其他已分配
未分配 + + +
其他已分配 + +  
ID_未启动 +    

Unicode联盟正式通过了一项关于标识符。有关更多信息,请参阅[稳定性].

1.2自定义

每个编程语言标准都有自己的标识符句法;不同的编程语言有不同的约定用于使用某些字符,例如$、@、#和_in标识符。扩展这样的语法以涵盖Unicode实现,实现者可以组合这些特定规则使用此处提供的语法和属性。

每种编程语言都可以将其标识符语法定义为相对的Unicode标识符语法,例如说标识符由Unicode属性定义,并添加“$”。一组特定语言的加法或减法字符,编程语言标准可以轻松跟踪以兼容的方式增加Unicode字符库。请参见第2.5节,向后兼容性

类似地,每种编程语言都可以定义自己的与Unicode相关的空白字符或语法字符Pattern_White_Space或Pattern_Syntax字符,带有一些指定的字符加法或减法的集合。

希望扩展标识符以包含中使用的单词的系统自然语言或用于安全的狭义标识符可以这样做中描述的第2.3节,布局和格式控制字符,第2.4节,特定字符调整、和第5节,规范化和案例

为了保持中所示类别的不相交性1,任意字符补充到其中一个类别必须是减去的从其他人那里。

注:在许多情况下可能需要额外约束的安全影响标识符。有关更多信息,请参阅[UTR36标准].

1.3显示器格式

实现可以使用以下格式显示标识符与用于比较标识符。例如,一个实现可能会显示用户已输入,但使用规范化格式进行比较。这方面的例子包括:

案例。显示格式保留大小写差异,但比较格式使用Case_Folding将其擦除。因此“A”及其小写变体“A”将被视为相同的内部标识符,即使它们可能已被输入不同,可能显示不同。

变体。显示格式保留变量区别,如半幅与全幅形式,或变异序列及其基本特征,但比较格式使用NFKC_Case_Folding擦除它们。因此,“A”及其全宽变体“A”将被视为相同的标识符在内部,即使它们可能以不同的方式输入,也可能以不同的方式显示。

有关显示格式与比较格式的使用示例,请参见UTS公司#46:Unicode IDNA兼容性处理[UTS46标准]. 有关更多信息关于标识符中的规范化和大小写,请参阅第5节,规范化和案例

1.4合规性

以下描述了实现可以声明符合此规范。

UAX31-C1型实现声称符合本规范应确定本规范的版本。

注:实现可以使用此的特定版本中基于属性的定义规范中包含来自Unicode字符数据库的未版本化引用的属性赋值。在这种情况下,实现应该为属性指定Unicode的最低版本。

UAX31-C2型实现声称符合本规范应说明遵守以下要求:

注:要求南非兰特已删除。会议时添加的字符这一要求现在是违约的一部分;此操作所需的上下文检查该要求仍然是Unicode技术标准#39“Unicode安全机制”中通用安全配置文件的一部分[UTS39标准].
注:满足要求R3等同于满足要求R3a和R3b。

1.5符号

本附录使用UnicodeSet(唯一代码集)表示法,用以说明一些属性或字符集。此符号在“Unicode集合”部分属于UTS#35,Unicode区域设置数据标记语言[UTS35标准].

2默认标识符

这里提供的形式语法捕获了一般意图标识符由以开头的字符串组成字母或表意文字,后面跟着任意数量的字母,表意文字、数字或下划线。它提供了保证向后兼容每个Unicode的后续版本,但也添加了任何适当的新Unicode字符。

这些公式还允许扩展称为配置文件。即,特定的代码点集或代码点序列语法使用的每个类别都可以根据环境的要求。描述了配置文件作为对语法使用的类别的添加或删除。因此,只要没有冲突(一个配置文件添加一个字符),就可以组合它们另一个删除它),或指定此类冲突的解决方案。

如果此类扩展名包含Pattern_White_Space或Pattern_Syntax,则此类标识符不符合未修改的UAX31-R3 Pattern_White_Space和Pattern_Syntax字符然而,此类扩展通常是必要的。对于例如,Java和C++标识符包括“$”,它是一个Pattern_Syntax字符。

UAX31-D1型违约标识符语法:

<标识符>:=<开始><继续>*(<中间><继续>+)*

标识符通过分配在Unicode中定义为属性的词法类集字符数据库[UAX44型].这些属性如所示表2. The第一列显示属性名称,其值在UCD。第二列提供了对关联类的覆盖范围,派生关系ID属性和XID属性之间,以及关联的Unicode为类设置表示法。

表2。的词汇类的属性标识符

属性 保险范围概述
ID_启动 ID_启动字符源自Unicode大写字母、小写字母、,标题字母、修饰字母、其他字母、字母数字,加上Other_ID_Start,减去Pattern_Syntax和Pattern_White_Space代码点。

在UnicodeSet表示法中:
[\p{L}\p{Nl}\p{其他ID_Start}-\第页{模式_语法}-\p{图案_白色_空格}]
XID_开始 XID_开始字符是派生自ID_启动根据第5.1节,NFKC修改
ID_继续 ID_继续字符包括ID_Start字符,以及具有Unicode通用_非空格标记类别,空格组合标记、十进制数字、连接符标点符号和加号Other_ID_Continue,减去Pattern_Syntax和Pattern_White_Space代码点。

在UnicodeSet表示法中:
[\p{ID_Start}\p{Mn}\p{Mc}\p}Nd\p{Pc}\p{其他ID_Continue}-\第页{模式_语法}-\p{图案_白色_空格}]
XID_继续 XID_继续字符派生自ID_继续根据章节5.1,NFKC修改

XID_继续字符也称为标识符字符,因为它们是XID_开始字符。

请注意,“其他字母”包括表意文字。有关稳定性扩展,请参见第2.5节向后兼容性

覆盖Unicode的标识符语法的创新标准包括以下内容:

XID_Start和XID_Continue属性改进了词法包含中所述更改的类第5.1节,NFKC修改出于大多数目的,特别是出于安全考虑,建议使用它们,在原始ID_ Start和ID_ Continue属性之上。

UAX31-R1系列违约标识符: 为了满足此要求,确定字符串是一个标识符,实现应选择其中之一UAX31-R1-1型UAX31-R1-2型

UAX31-R1-1型使用定义UAX31-D1型,设置开始和分别转至属性XID_Start和XID_Continue,并将Medial留空。

UAX31-R1-2型声明它使用轮廓属于UAX31-R1-1型并用精确的添加到Start或从Start中删除的字符和字符序列,继续,Medial和/或提供其他对标识符的约束。

注:此类规范可包含对一个或多个中描述的标准配置文件第7节,标准配置文件

其中一个配置文件可以使用ID_Start和ID_Continue的内容代替XID_Start和XID_Continue,以实现向后兼容性。

另一个这样的配置文件将包括一些可选字符,例如:

注:Medial类中的字符不能与中的字符重叠Start或Continue类。因此,从表3a必须进行检查,以确保它们不会同时出现在新定义的Start类中或继续上课。

除了这些小的修改之外,配置文件还可以用于显著扩展标识符中可用的字符集。在这样做时,必须注意不要无意中包含不需要的字符,或者违反重要的不变量。

在将基于属性的集合添加到概要文件时,实现应该小心。

例如,考虑一个添加下标和上标数字以及运算符以支持技术符号,例如:

上下文 示例标识符
分类学 盾美分
化学 钙浓度
数学 xₖ₊ᢱ f⁽4⁾
语音学 大安

该配置文件可以描述为将以下集合添加到XID_Continue:

[⁽₍⁾₎⁺₊⁼₌⁻₋⁰₀¹₁²₂³₃⁴₄⁵₅⁶₆⁷₇⁸₈⁹₉]
注:以上列表仅供说明。提供了一个标准配置文件,以支持在标识符中使用数学兼容性符号配置文件。请参见第7.1节,数学兼容性符号配置文件

如果配置文件没有明确列出这些字符,而是选择使用属性或属性组合,可能导致包括不需要的字符。

例如,\p{General_Category=其他编号}是常规类别集包含下标和上标数字。但它也包括兼容性字符[⑴ 🄂 ⒈],其中包括技术符号不需要,并且很可能不适用于身份识别器-在多种情况下。

另一方面,允许在标识符中使用货币符号的语言可能具有\p{General_Category=货币符号}作为配置文件,因为这个属性符合目的。

类似地,基于添加整个块的简档可能包括非故意的字符,或者错过想要的。有关块的使用,请参见附录A,字符块,在[UTS18标准].

通过使用属性定义配置文件还需要考虑以下事实除非属性设计为稳定(例如XID_Continue),在未来版本的Unicode中可以删除代码点。如果配置文件还需要稳定的标识符(向后兼容),那么它必须采取额外的措施。请参见UAX31-R1b稳定标识符

需要标识符闭包的实现规范化下应确保任何自定义配置文件都保留标识符闭包在所选规范化表单下。请参见第5.1.3节,规范化下的标识符闭包。上面引用的有关下标和上标的示例在规范化形式C和D,但在表格KC和KD下。在NFKC和NFKD下,下标和上标括号和运算符将规范化到ASCII对应项。如果使用此概要文件的实现依赖于规范化下的标识符闭包应符合UAX31-R4型使用NFC,而不是NFKC。

注:虽然默认标识符不如不可变标识符开放,他们仍然受到来自隐形字符的欺骗问题的影响,视觉上相同的字符,或双向重新排序,导致出现不同的序列以相同的顺序。在欺骗问题相关的情况下Unicode技术标准#39,“Unicode安全机制”[UTS39标准],应该使用。对于编程语言和编程环境的特定情况,建议见Unicode技术标准#55,“Unicode源代码处理”[UTS55标准].

UAX31-R1a型受限制的设置字符格式: 本条款已删除。

会议时添加的字符这一要求现在已成为违约的一部分;此操作所需的上下文检查该要求仍然是Unicode技术标准#39“Unicode安全机制”中通用安全配置文件的一部分[UTS39标准].

UAX31-R1b型稳定标识符: 为满足此要求,实施应确保标识符在Unicode的各个版本中都是稳定的标准:也就是说,一旦字符串符合标识符的条件,它就会满足因此,在所有未来版本的Unicode标准中。

注:UAX31-R1b的要求是当标识符定义基于来自对Unicode标准的未版本化引用,因为属性赋值可能未来版本标准中的变更。通常通过使用限定为标识符字符的小字符列表在以前版本的Unicode中。请参见第2.5节,向后兼容性如果允许配置文件,可能还需要管理这些配置文件以保证向后兼容性。通常,此类管理还使用以前符合条件的字符列表。因为稳定政策[稳定性],如果实现满足任一要求UAX31-R1系列UAX31-R2型没有声明配置文件,该实现也满足UAX31-R1b的要求。

例子:考虑一个标识符定义,该定义使用UAX31-R1系列具有添加数字的配置文件的默认标识符(General_Category=Nd的字符)到集合启动,并使用对Unicode字符数据库的未版本化引用,最低版本为5.2.0。

使用Unicode 5.2.0版的属性赋值(U+19DA)和A᧚(U+0041,U+19DA)是有效标识符根据此定义:U+19DA具有General_Category=Nd。

在Unicode版本6.0.0中,U+19DA的General_Category=No。标识符A᧚(U+0041,U+19DA)仍然有效,因为XID_Continue包含以前是XID_Ccontinue的任何字符。然而,不是有效标识符,因为U+19DA不是集合中更长的[:Nd:]。

为了满足要求UAX31-R1b型,定义会需要更改以添加到集合启动所有具有从Unicode 5.2.0开始的任何Unicode版本中的属性General_Category=Nd以及实现所使用的版本。

2.1结合标志

组合标记在标识符语法中说明:组合标记由基本字符后跟任意字符组成的字符序列组合标记的数量在标识符中有效。组合标记在许多语言的表示中都是必需的,并且中的一致性规则第3章,合规性,第页,共页[Unicode码]要求规范等价字符序列的解释。这个最简单的方法是要求NFC格式的标识符(或将其转换为该格式);看见第5节,规范化和案例

封闭组合标记(如U+20DD..U+20E0)不包括在定义词汇类ID_继续,因为合成字符的合成字母本身通常被认为是无效的这些标识符的组成部分。

2.2修饰符信件

修饰字母(General_Category=Lm)也包含在标识符的语法类的定义。修饰字母通常是自然语言拼写的一部分,对用正式语言制作类单词标识符。另一方面,修饰符符号(General_Category=Sk),很少是语言拼写不包括在标识符中。更多信息关于修饰字母及其功能的讨论,请参见[Unicode码].

定制特殊标识符语法的实现目的可能希望特别注意修饰字母,如有些情况下,修饰字母会出现,例如凸起的逗号,它可能与常见的语法字符(如引号)混淆标志。

2.3布局和格式控制字符

某些Unicode字符称为默认可忽略代码点。其中包括变体选择器和用于控制连接行为、双向排序的字符控件和其他显示格式(具有Cf的General_Category值)。使用首先,标识符中的默认可忽略字符存在问题因为它们所代表的效果是风格上的或其他方面的标识符的作用域,其次是因为字符本身通常没有可见的显示。也有可能误用这些字符,以便用户可以创建外观相同但实际上包含不同的字符,这可以创建安全性问题。在以欺骗问题为重的环境中,例如顶级域名,标识符也应限制为使用NFKC_Casefold进行大小写折叠和规范化的字符操作。有关更多信息,请参阅第5节,规范化和案例UTR公司#36:Unicode安全注意事项[UTR36标准].

虽然并非所有Default_Ignorable_Code_Points都在XID_Continue中,但变体选择器和连接控件包含在XID_Continue中。这些变体选择器用于标准化变体序列、表意变体数据库中的序列和表情符号变体序列。连接控件用于某些语言的正字法以及表情符号ZWJ序列。然而,这些字符与上面列出的其他Default_Ignorable_Code_Points受到相同的考虑。因为变体选择器和连接控件要求显示差异,但不保证显示差异,所以它们在通用标识符中不起作用。应该使用配置文件从通用标识符中删除它们(以及其他Default_Ignorable_Code_Points),除非在特定域中需要使用它们,例如在包含表情符号的配置文件中。对于这样的配置文件,在标识符语法中显式地保留甚至添加某些Default_Ignorable_Code_Points可能是有用的。

对于编程语言标识符,欺骗问题通过更高级别的诊断而不是在语法级别得到更全面的解决。参见Unicode技术标准#55,“Unicode源代码处理”[UTS55标准].

比较。在标识符的显示形式与用于比较的形式不同的任何环境中,应忽略Default_Ignorable_Code_Points进行比较。例如,这适用于区分大小写的标识符。有关更多信息,请参阅第1.3节,显示格式

笔记:

此外,还提供了一个标准配置文件来排除所有Default_Ignorable_Code_Points;看见第7节,标准配置文件但是,请注意,即使排除了Default_Ignorable_Code_Points,欺骗问题仍然存在,除非Unicode技术标准#39“Unicode安全机制”中的机制[UTS39标准]都被利用了。

第3.1节标识符通用安全配置文件中定义的通用安全配置UTS#39,Unicode安全机制[UTS39标准],默认情况下排除所有Default_Ignorable_Code_Points,包括变体选择器。

2.4特定字符调整

特定的标识符语法可以被视为裁剪(或配置文件)基于字符属性的通用语法。例如,SQL标识符允许下划线作为标识符继续,但不允许作为标识符开始;C标识符允许下划线作为标识符继续或标识符开始。特定语言可能还想排除具有Decomposition_Type的字符而不是规范或无,或排除其中的某些子集,例如Decomposition_Type等于Font的那些。

在某些情况下,预计标识符会更多完全包含自然语言中使用的单词或短语。对于例如,建议允许U+00B7(·)中间点自然语言标识符中的中间位置,例如哈希标签或搜索词,因为它是语法加泰罗尼亚语所必需的。有关MIDDLE DOT的相关问题,请参阅第5节,规范化和案例

对于更多自然语言标识符,配置文件应允许中的个字符表3,3a年、和 表3b在里面标识符,除非有令人信服的理由不这样做。对标识符的大多数添加都受到限制中间位置,如U+00B7(·)中间点,不需要作为加泰罗尼亚语中的尾随字符。这些在中列出表3a。几个字符可以也出现在最终位置,并列在表3b.这些内容表格可能重叠。

在某些环境中,甚至在空间和@允许在标识符中使用,例如在SQL中:从中选择*员工养老金。

表3。开始的可选字符

代码点 字符 姓名
0024 $ 美元标志
005华氏度 _ 低端线路

表3a。Medial的可选字符

代码点 字符 姓名
0027 ' 阿波斯特罗
002D(002D) - HYPHEN-MINUS公司
002E公司 完全停止
003A号 以下为: 科隆
00比7 · 中点
058A型 ֊ 亚美尼亚海芬
05年4月 ״ HEBREW PUNCTUATION德国
0F0B型 藏语标记语间TSHEG
2010 连字符
2019 右侧单引号
2027 下划线点
30A0型 KATAKAN-HIRAGANA双HYPHEN

表3b。可选字符继续

代码点 字符 姓名
05层 ׳ 希伯来普恩图瓦提格瑞什(HEBREW PUNCTUATION GERESH)

在UnicodeSet表示法中,这些表中的字符为:

在允许非规范化字符的标识符中中列出的字符的等效兼容性表3,表3a、和表3b也可能是适当的。

有关单词中可能出现的字符以及可用于名称验证,参见第4节,单词边界,英寸[阿联酋29].

有些脚本不是现代常用的,因此实现可能希望将它们从标识符中排除。这些包括历史和过时的脚本,使用的脚本大部分是礼拜式的,而地区文字只在很小的地方使用社区或当前使用非常有限。一些脚本还存在未解决的体系结构问题,这使得它们目前不适合用作标识符。中的脚本表4,排除的脚本建议从标识符中排除。

表4。排除的脚本

属性符号 描述
\p{script=Aghb} 高加索阿族
\p{script=Ahom} Ahom公司
\p{script=阿米} 帝国亚拉姆语
\p{script=Avst} 阿维斯坦
\p{script=Bass} 巴萨瓦赫
\p{script=Bhks} 白铃木
\p{script=Brah} 布拉米
\p{script=Bugi} 布吉文
\p{script=Buhd} 布希德文
\p{script=Cari} 卡里安
\p{script=Chrs} 花剌子模语
\p{script=Copt} 科普特语
\p{script=Cpmn} 赛普罗-米农
\p{script=Cprt} 塞浦路斯人
\p{script=Diak} 潜水阿库鲁
\p{script=Dogr} 多格拉
\p{script=Dsrt} 德塞雷特
\p{script=重复} Duployan公司
\p{script=Egyp} 埃及象形文字
\p{script=Elba} 埃尔巴桑语
\p{script=Elym} 伊利亚克
\p{script=Glag} 格拉戈里岩
\p{script=Gong} 贡贾拉·贡迪
\p{script=Gonm} 马萨兰·贡迪
\p{script=Goth} 哥特式的
\p{script=Gran} 格伦萨
\p{script=Hano} 汉努诺奥人
\p{script=Hatr} 哈特兰
\p{script=Hluw} 安纳托利亚象形文字
\p{脚本=Hming} Pahawh苗族
\p{script=挂起} 古匈牙利语
\p{script=Ital} 古意大利文
\p{script=Kawi} 卡维
\p{script=Khar} 卡罗须提文
\p{script=Khoj} 科伊基
\p{script=Kits} 契丹小字
\p{script=Kthi} 凯提文
\p{script=Lina} 线性A
\p{script=Linb} 线性B
\p{script=莱西} 莱西亚语
\p{script=Lydi} 利甸语
\p{script=Maka} 望加锡
\p{script=Mahj} 马哈贾尼
\p{script=Mani} 摩尼教徒
\p{script=Marc} 马琴
\p{script=Medf} 美德福林
\p{script=Mend} 门德·基卡奎
\p{script=Merc} 梅洛伊特草书
\p{script=Mero} Meroitic象形文字
\p{script=Modi} 莫迪
\p{script=Mong} 蒙古族
\p{script=Mroo} 姆罗
\p{script=Mult} 穆尔塔尼
\p{script=Nagm} 纳格蒙达里
\p{script=Narb} 古北阿拉伯
\p{script=Nand} 南迪纳加里
\p{script=Nbat} 纳巴泰人
\p{script=Nshu} 女书
\p{script=Ogam} 奥格姆
\p{script=Orkh} 古突厥语
\p{script=Osma} 索马里
\p{script=Ougr} 老维吾尔族
\p{script=Palm} 帕尔迈拉文
\p{script=Pauc} Pau Cin Hau公司
\p{script=Perm} 旧二叠纪
\p{script=Phag} 八思巴字母
\p{script=Phli} 铭文巴列维
\p{script=Phlp} 诗篇巴列维
\p{script=Phnx} 腓尼基人
\p{script=Prti} 帕提亚铭文
\p{script=Rjng} 拉让
\p{script=Runr} 北欧古文
\p{script=Samr} 撒玛利亚人
\p{script=Sarb} 古南阿拉伯
\p{script=Sgnw} 签名书写
\p{script=Shaw} 沙维亚语
\p{script=Shrd} 莎拉达
\p{script=Sidd} 悉昙
\p{script=Sind} 胡达瓦迪
\p{script=Sora} 索拉·桑彭
\p{script=Sogd} 索格迪安
\p{script=Sogo} 老索格迪安
\p{script=Soyo} 索永布
\p{script=Tagb} 塔格巴努亚文
\p{script=Takr} 塔克里
\p{script=Tang} 西瓜
\p{script=Tglg} 塔加路语
\p{script=Tirh} 蒂尔胡塔
\p{script=Tnsa} 唐萨
\p{script=Toto} 托托
\p{script=Ugar} 乌加里特语
\p{script=Vith} 维奇库奇
\p{script=Wara} 瓦朗花旗银行
\p{script=Xpeo} 古波斯语
\p{script=Xsux} 楔形文字
\p{script=Yezi} 耶兹迪
\p{script=Zanb} Zanabazar广场

与推荐脚本一起使用的某些字符对于标识符来说可能仍然有问题,例如,因为它们是现代习惯用法中没有的扩展的一部分,因此实现可能希望将它们从标识符中排除。其中包括用于历史和过时正字法的字符,主要用于礼拜仪式的字符,以及用于仅在非常小的社区中使用的语言的正字法,或当前使用非常有限或正在减少的使用。一些字符还存在体系结构问题,可能使它们不适合用作标识符。请参见UTS#39,Unicode安全机制[UTS39标准]了解更多信息。

中列出的脚本表5,推荐的脚本通常建议用于标识符。这些都是广泛的现代习惯用法,或大型社区现代习惯使用的地区文字。

表5。推荐的脚本

属性符号 描述
\p{script=Zyyy} 通用
\p{script=Zinh} 继承
\p{script=Arab} 阿拉伯语
\p{script=Armn} 亚美尼亚语
\p{script=Beng} 孟加拉语
\p{script=Bopo} 汉语拼音
\p{script=Cyrl} 西里尔文
\p{script=Deva} 梵文
\p{script=伦理} 埃塞俄比亚语
\p{script=Geor} 格鲁吉亚语
\p{script=Grek} 希腊人
\p{script=Gujr} 古吉拉特邦
\p{script=Guru} 锡克教
\p{script=挂起} 朝鲜文
\p{script=Hani} 汉族
\p{script=Hebr} 希伯来语
\p{script=Hira} 平假名
\p{script=Kana} 片假名
\p{script=Knda} 卡纳达语
\p{script=Khmr} 高棉语
\p{script=Laoo} 老挝语
\p{script=Latn} 拉丁语
\p{script=Mlym} 马拉雅拉姆语
\p{script=Mymr} 缅甸
\p{script=Orya} 奥里亚语
\p{script=Sinh} 僧伽罗语
\p{script=Taml} 泰米尔语
\p{script=Telu} 泰卢固语
\p{script=Thaa} 塔安那文
\p{script=泰语} 泰语
\p{script=藏语} 藏语

从Unicode 10.0开始理想的使用和有限的使用脚本,因为这还没有被证明对于与标识符相关的类的派生是有效的用于安全配置文件。(请参见UTS#39,Unicode安全机制[UTS39标准].) 因此,有抱负的使用脚本在里面表6,渴望式使用脚本已被重新分类作为有限使用并移至表7,有限使用脚本

表6。渴望式使用脚本(撤回)

属性符号 描述
故意空白

中列出了使用更为有限的现代脚本表7,有限使用脚本为了避免安全问题,一些实现可能希望禁止标识符中使用受限的脚本。有关的详细信息用法,请参阅Unicode Locale项目[CLDR公司].

表7。有限使用脚本

属性符号 描述
\p{script=Adlm} 阿德拉姆
\p{script=Bali} 巴厘岛语
\p{script=Bamu} 巴穆姆
\p{script=Batk} 巴塔克
\p{script=Cakm} 恰克玛
\p{script=Cans} 加拿大土著音节
\p{script=Cham} 查姆
\p{script=Cher} 切罗基
\p{script=Hmnp} Nyiakeng Puachue苗族
\p{script=Java} 爪哇语
\p{script=Kali} 克耶字母
\p{script=Lana} 泰坦语
\p{script=Lepc} 雷布查
\p{script=Limb} 林布
\p{script=Lisu} 傈僳
\p{script=Mand} 曼达克语
\p{script=Mtei} 曼尼托·马耶克
\p{script=Newa} 诺瓦
\p{script=Nkoo} Nko公司
\p{script=Olck} 奥尔·奇基
\p{script=Osge} 奥萨奇
\p{script=Plrd} 苗族
\p{script=Rohg} 哈尼菲·罗辛亚
\p{script=Saur} 索拉什特拉
\p{script=Sund} 巽他语
\p{script=Sylo} 塞洛蒂·纳格里
\p{script=Syrc} 叙利亚语
\p{script=故事} 泰乐
\p{script=Talu} 新傣仂文
\p{script=Tavt} 泰乐
\p{script=Tfng} 提非纳文
\p{script=Vaii} 瓦伊
\p{脚本=Wcho} 万乔
\p{script=Yiii}

这是当前Unicode版本的建议;作为新脚本将添加到未来版本的Unicode中,字符和脚本可能添加到表中4,5、和7。字符也可以是随着信息的增加,从一个表移到另一个表可用。

有一些特殊情况:

对于编程语言标识符,规范化和case具有重要影响的数量。为了讨论这些问题,看见第5节,规范化和案例

2.5向后兼容性

Unicode General_Category值保持尽可能稳定,但是它们可以在Unicode标准的不同版本之间变化。大部分具有给定值的字符由其他未来的覆盖范围将根据这些属性的分配。此外,Other_ID_Start属性提供限定为某些早期版本的Unicode中的ID_Start字符仅位于它们的General_Category属性的基础,但这不再符合当前版本的条件。

Other_ID_Start属性包括诸如以下内容:

U+2118(℘)脚本大写字母P
U+212E(℮)估计符号
U+309B(゛)KATAKANA-HIRAGANA语音标记
U+309C(°)KATAKAN-HIRAGANA半人声标记

类似地,Other_ID_Continue属性添加一个小列表在某些以前的仅基于其General_Category的Unicode版本属性,但在当前版本中不再适用。

Other_ID_Continue属性包括以下字符以下内容:

U+1369伦理数字一。。。U+1371十进制数字九
U+00B7(·)中点
U+0387(·)希腊ANO TELEIA
U+19DA(᧚)新泰勒塔姆数字一

Other_ID_Start和其他_ID_Continue属性取决于Unicode的版本。对于更多信息,请参阅Unicode标准附件#44,“Unicode字符数据库“[UAX44型].

因此,Other_ID_Start和Other_ID_Continue属性如下旨在确保Unicode标识符规范向后兼容。限定为某些版本的Unicode中的标识符将继续作为标识符。

如果规范针对标识符,则此技术还可以用于维护跨版本的向后兼容性。

不可变标识符

使用定义的词汇类的缺点前面是详细定义所需的存储空间,加上每个新版本的Unicode标准添加了现有解析器无法添加的字符认识到。换言之,基于该表的建议不向上兼容。

这个问题可以通过扭转问题来解决。与其定义允许的代码点集,不如定义为语法用途保留的一组固定的小代码点并允许其他所有内容(包括未分配的代码点)作为一部分标识符的。写入此规范的所有解析器都将所有版本的Unicode标准的行为方式都相同,因为代码点的分类永远是固定的。

这种方法的缺点是它允许“胡说八道”成为一部分由于关注词汇分类和人类的可理解性是分开的。人类的可理解性可以,但是,可以通过其他方式解决,例如使用指南鼓励限制标识符的有意义术语。对于此类指南的示例,请参阅W3C的XML规范,1.0版第5版或更高版本[XML格式].

通过增加不允许的字符集可以实现标识符的直观推荐。这个方法使用标识符类的完整规范Unicode标准的特定版本,永久不允许该版本中不建议包含的任何字符标识符。自该版本起,所有未分配的代码点都将是允许在标识符中使用,以便将来对标准进行任何添加可能已经被考虑在内了。这种方法确保了两者都向上兼容标识符的稳定性和合理划分角色变成那些有意义和没有意义的角色标识符。

无论有没有这种微调,这种折衷方法仍然会产生实现大量代码点列表的费用。虽然它们不再随着时间的推移而改变,但这是一个选择的问题强制执行某种类似单词的标识符的好处证明其成本合理。

或者,可以使用下面描述的属性和允许所有字符序列都不是标识符Pattern_Syntax或Pattern_White_Space。这有以下优点简单和小桌子,但允许更多“不自然”标识符。

UAX31-R2型不可变标识符: 为了满足这一要求,实施应选择其中之一UAX31-R2-1型UAX31-R2-2型

UAX31-R2-1型将标识符定义为任何非空不包含任何具有以下属性值:

UAX31-R2-2型声明它使用轮廓属于UAX31-R2-1型并用精确的添加到代码点集或从代码点集中删除的字符和字符序列由这些属性定义和/或提供标识符的附加约束列表。

注:实现符合要求的UAX31-R2不可变标识符的期望是,它永远不会更改标识符的定义;特别是,它不会切换到UAX31-R1默认标识符。然而,规范化问题的缺点以及防范欺骗攻击的措施的不适用性,可能需要改变定义。在这种情况下,应该使用概要文件来扩展XID_Start和XID_Continue,以涵盖可能的现有用法。请参见第3.3节,语言演变,在Unicode技术标准#55中,“Unicode源代码处理”[UTS55标准].

在其概要文件中,规范可以将标识符定义为更符合采用配置文件的时间,同时仍然允许严格不变性。例如,一个实现在发布了特定版本的Unicode(例如Unicode 5.0)可以如下定义配置文件:

  1. 所有字符都满足UAX31-R1系列默认标识符根据Unicode 5.0
  2. 加上Unicode 5.0中未分配的所有代码点具有中指定的属性值UAX31-R2不可变标识符

此技术允许标识符具有更自然的不包括已定义的符号和标点符号的格式提供绝对码位不变性。

不可变标识符适用于以下情况(如XML)无法跨Unicode版本更新,并且不需要有关规范化表单或属性的信息,例如通用类别和脚本。允许使用的不可变标识符未分配的字符无法提供规范化表单或这些属性,这意味着它们:

为了实现最佳实践,应尽可能提供不允许未分配字符的配置文件。

规范还应包括以下方面的指南和建议创建新标识符的。尽管UAX31-R2不可变标识符允许广泛的字符,作为最佳实践标识符,应采用以下格式NFKC,不使用任何未分配的字符。有关更多信息关于NFKC,请参阅Unicode标准附录#15,“Unicode规范化表格”[UAX15型].

4空白和语法

大多数编程语言都有一个概念空白作为词汇结构的一部分,以及一些标识符中不允许使用但具有语法的字符使用,例如算术运算符。除了通用编程语言之外,在许多情况下,软件也会进行解释混合了文字字符、空白和语法的模式字符。示例包括正则表达式、Java排序规则规则、Excel或ICU数字格式等。过去,正则表达式和其他形式语言被迫在语法中使用ASCII字符的笨拙组合。作为Unicode变得无处不在,其中一些将开始使用非ASCII语法字符:首先是可读性更强的可选字符备选方案,然后最终作为标准语法。

对于前向和后向兼容性,具有修复了空白和语法代码点的集合。这遵循Unicode联盟提出的建议关于完全稳定的标识符,以及见XML 1.0、第5版或更高版本[XML格式]. (特别是Unicode Consortium承诺不分配合适的字符用于U+2190..U+2BFF范围内的标识符XML 1.0,第5版。)

从Unicode 4.1开始,定义了两个Unicode字符属性提供稳定的语法:Pattern_White_Space和模式_语法。当然,特定的语言可能,覆盖这些建议,例如,通过添加或删除与ASCII用法兼容的其他字符。

对于稳定性,这些属性的值是绝对的不变,不随Unicode的后续版本而变化。当然,这并不限制Unicode标准的能力编码更多的符号或空白字符,但默认的语法集和建议在计算机语言中使用的空白代码点不会更改。

UAX31-R3型图案_白色_空格和Pattern_Syntax字符: 为了满足这一要求实施应满足两者UAX31-R3a型UAX31-R3b型

注:满足要求时UAX31-R3型没有配置文件,除之外的所有字符具有Pattern_White_Space或Pattern_Syntax属性的可用于定义标识符或文字。

4.1空白

许多计算机语言对两类空白的处理方式不同:水平空格(如ASCII水平制表和空格)和行终止符。

当语法支持非ASCII字符时,考虑第三类很有用:可忽略的格式控件。可以在词汇元素之间插入可忽略的格式控件,以解决双向排序问题,如第4.1.1节,双向订购这些字符的插入不会改变程序的含义;特别是,它们不是空格字符。请参见第4.1.2节,所需空间

注:允许插入可忽略的格式控件并不能防止基于双向重新排序的欺骗。为了防止此类欺骗,实现应该使用更高级的协议,并转换为Unicode标准附件#9“Unicode双向算法”中描述的纯文本[UAX9系列]. 参见Unicode技术标准#55,“Unicode源代码处理”[UTS55标准].
注:由于这些字符只允许出现在词汇元素之间没有边界的地方,因此在词法分析时,实现可以忽略它们,然后将包含它们的任何词汇元素视为非法。注释和字符串必须例外,它们应该能够自由包含这些字符。

实现还应该允许这些字符出现在可能出现重新排序问题的其他上下文中。参见Unicode技术标准#55,“Unicode源代码处理”[UTS55标准].

UAX31-R3a型Pattern_White_Space字符: 为了满足这一要求实施应选择其中之一UAX31-R3a-1型UAX31-R3a-2型

UAX31-R3a-1型使用Pattern_White_Space字符作为解析中解释为空白的字符集,如下所示:

  1. 下列任一字符的序列应解释为一个或多个行结束的序列:
    1. U+000A(馈线)
    2. U+000B(垂直制表)
    3. U+000C(换页)
    4. U+000D(回车)
    5. U+0085(下一行)
    6. U+2028线路分离器
    7. U+2029段落分隔符
  2. 属性为Default_Ignorable_Code_Point的Pattern_White_Space字符应视为可忽略的格式控件;它们应该在上下文中被允许UAX31-I1型,UAX31-I2型、和UAX31-I3型定义于第4.1.3节,可忽略格式控件的上下文,其插入不得影响程序的含义。
  3. Pattern_White_Space中的所有其他字符应解释为水平空格。

UAX31-R3a-2型声明它使用轮廓属于UAX31-R3a-1型并用精确的添加到代码点集或从代码点集中删除的字符由Pattern_White_Space属性定义,以及对将字符或字符序列解释为行尾、可忽略格式控件或水平空格的条件的任何更改。

注:中第2项下被视为可忽略格式控件的字符UAX31-R3a-1型是U+200E左右标记和U+200F左右标记UAX31-R3a-1型是U+0020空格和U+0009(水平制表,TAB)。
注:字符LEFT-TO-RIGHT MARK和RIGHT-T-LEFT MARK是由第2.6节,隐含方向标记,在Unicode标准附录#9中,“Unicode双向算法”[UAX9系列]. 第三种是阿拉伯字母标记,它的使用频率远低于其他字母标记,甚至在阿拉伯语文本中也是如此;它的行为与RIGHT-TO-LEFT MARK有着微妙的不同,其方式通常与源代码的顺序无关。如果配置文件将其添加到空白字符集,则会将其解释为可忽略的格式控件。
注:未能解释第1项中列出的所有字符UAX31-R3a-1型因为线路终端会导致欺骗问题;参见Unicode技术标准#55,“Unicode源代码处理”[UTS55标准].

4.1.1双向订购

要求UAX31-R3a型即使对于不相关的语言使用不可变的标识符,或者在语法和空白字符的类别。特别是选择Pattern_White_Space字符以进行更正广泛编程中可能出现的双向排序问题语言,在视觉上模糊了表达式的逻辑。如果没有更高级别的协议(参见第4.3节,高级协议,英寸[UAX9型]),标记可以是可视的在双向源文本中由Unicode Bidi算法重新排序,产生传达不同逻辑意图的视觉结果。为了解决这个问题,Pattern_White_Space中有两个隐式方向标记字符;如果这些可以在标记之间自由插入,则隐式定向标记与段落方向一致可用于确保标记的视觉顺序与其逻辑顺序相匹配。

例子:考虑以下两行:

(1)x+tav==1
(2)x+==1

在内部,它们是相同的,只是ASCII标识符塔夫第(1)行替换为希伯来语标识符תו在第(2)行中。然而,使用纯文本显示(从左到右段落方向),用户会被误导,认为第(2)行是(x+1)תו,而实际上它是一个比较(x+)1(2)的误导性呈现是因为标识符的方向性影响后续弱定向标记;从左到右插入标识符后的标记希腊语阻止它影响行,从而在从左到右的纯文本中产生更好的渲染效果段落方向,如下表所示,其中字符其排序受该标识符的影响已突出显示。

基本陈述 显示(LTR段落方向)
x个   +   ת ו   = =   1 x个+希腊语==1
x个   +   ת ו ⟨LRM⟩   = =   1 x个+תו‎ == 1

第5.2节,转换为纯文本,在Unicode技术标准#55中,“Unicode源代码处理”[UTS55标准],指定自动插入LRM字符的算法。

注:当主方向是从左到右。相应地,使用从右到左的标记当主方向是从右向左时。

4.1.2所需空间

由于隐式方向标记是非空格的,因此语法需要一系列空格(例如标识符之间的空格),应该要求at其中至少有一个既不是从左到右标记,也不是从右到左标记否则,视觉外观会让读者感到困惑:”其他的⟨LRM⟩如果将被用户视为“埃尔塞夫“但编译器将其解析为”否则,如果”,而“其他的⟨LRM⟩如果“将被视为”否则,如果“并且无害。

4.1.3可忽略格式控件的上下文

实现应至少允许在以下上下文中插入可忽略的格式控件,如示例所示,其中可忽略的格式控件由⟨LRM⟩表示。

UAX31-I1型靠近词汇水平空间(在词汇水平空间序列中,或在此类序列的开始或结束处)。

例子:在以下关键字之间用空格隔开:

其他的⟨LRM⟩如果

注:短语“词汇水平空间”指的是不仅在水平空间字符集中,而且在词汇空间上下文中的字符。例如,它不包括字符串文字中的水平空格字符。实现应该允许在字符串文字中使用这些字符,但在这种文字中,它们的插入会影响程序的含义,因为它们随后会出现在由该文字表示的字符串中。

UAX31-I2型作为可选空间,即在不改变程序含义的情况下可以插入水平空间的任何位置。

例子:在以下算术表达式中的加号之前:

x个⟨LRM⟩+1

UAX31-I3型。位于词法行的开头和结尾。

例子:在以下Python行中的单词import之前:

⟨LRM⟩导入unicode数据

注:正如以下情况UAX31-I1型,中“词汇行”的开始和结束UAX31-I3型不在多行字符串文本中分别包含行的开始和结束。此上下文不同于UAX31-I2型在前导或尾随空格有意义的语言中。

4.2语法

形式语言的词法结构包含标识符中不允许使用的字符,并且这些字符不是空白字符,但它们具有一些特殊的词法意义,而不是文字字符(例如字符串文字)或忽略的字符(例如注释)。这些在本文件中称为具有句法用途的字符

使用句法的字符示例包括:

将字符集与句法用法绑定在一起是很有用的。这使得可以构建处理源代码但不验证源代码的工具,例如语法高亮显示,以向前兼容的方式;参见Unicode技术标准#55,“Unicode源代码处理”[UTS55标准].它还提供了一组稳定的字符,可用于用户定义的运算符。此外,这允许文本(包括模式)的向后兼容性,如中所述第4.3节,模式语法

UAX31-R3b型模式_语法字符: 为了满足这一要求实施应选择其中之一UAX31-R3b-1型UAX31-R3b-2型

UAX31-R3b-1型使用Pattern_Syntax字符作为字符集使用句法。以下几组应不相交:

  1. 标识符中允许的字符
  2. 被视为空白的字符
  3. 具有句法用途的字符

UAX31-R3b-2型声明它使用轮廓属于UAX31-R3b-1型并用精确的添加到代码点集或从代码点集中删除的字符由Pattern_Syntax属性定义。

注:满足要求时UAX31-R3b型,标识符中允许的字符在语法中可能具有特殊意义,即使它们不是标识符的一部分。

例如,在一种对十六进制文字使用C语法并满足要求的语言中UAX31-R1系列,文字0x死板完全由标识符字符组成,但0x个在语法中具有特殊意义,前缀后面的字符受到特殊限制(只允许0到9和A到F)。

然而,标识符中允许的字符、被视为空白的字符和集[:Pattern_Syntax:]之外的字符在语法中不能具有特殊意义。例如,如果一种语言符合要求UAX31-R1系列UAX31-R3型由于没有配置文件并且允许用户定义操作符,该语言不能允许用户定义运算符🐈.

标识符中允许的字符之外的字符、被视为空白的字符以及语法使用的字符仍然可以在程序中使用,例如,作为字符串文字或注释的一部分。

4.2.1用户定义的操作员

一些编程语言允许用户定义运算符。满足要求时无人机31-R3b,运算符中允许的字符集是有限的;然而,这就留下了运算符的确切定义。为了避免词法分析中的歧义,不应允许运算符包含可能出现在标识符或文字开头的字符;例如,+1−x不应是操作员。

以下定义避免了与默认标识符和数字的这种交互。

UAX31-R3c型操作员标识符: 为满足此要求,实施应满足要求UAX31-R3b型Pattern_Syntax字符,并且为了确定字符串是否为运算符,应选择UAX31-R3c-1或UAX31-R3c-2。

UAX31-R3c-1型使用定义UAX31-D1型,将Start设置为使用语法的字符集,将Continue设置为使用句法的字符集和使用General_Category Mn的字符集的并集,并将Medial留空。

UAX31-R3c-2型声明它使用的配置文件为UAX31-R3c-1型并使用添加到Start、Continue和Medial或从中删除的字符和字符序列的精确规范来定义该配置文件,和/或提供运算符的附加约束列表。

注:Pattern_Syntax字符集包含一些表情符号,这是语法字符的默认值。实现可能希望删除它们,以便在标识符中使用它们,或者减少由于作为运营商,但🏉 不是一个人。这可以使用标准配置文件完成UAX31-R3b型中定义的Pattern_Syntax字符第7.2节,Emoji简介

Continue中包含非空格标记,因为它们是许多运算符(例如一些否定运算符)表示的一部分。

未分配的代码点不是字符;因此,它们被这个定义排除在外。

当满足此要求时,可能需要一个概要文件,这取决于语法的具体情况。例如,字符串文字以“”开头的编程语言应该从操作符中允许的字符中删除该字符。

4.3模式语法

使用一组固定的空白和语法代码点模式语言可以有一个需要所有可能语法的策略要引用的字符(即使是当前未使用的字符)文字。使用此策略可以保留扩展将来使用这些字符的语法。上的过去模式未来的系统将始终工作;过去系统的未来模式将发出错误信号,而不是默默地产生错误的结果。例如,考虑以下场景。

在程序X的1.0版中,“≈”是保留语法性格;也就是说,它不执行操作,它需要待报价。在本例中,“\”引用下一个性格;也就是说,它导致它被视为文字语法字符的。在程序X的2.0版中,“≈”是给出了一个真正的含义,例如“大写后接”字符”。

什么时候?生成规则或模式,所有空格和语法要成为文字的代码点需要引用,使用任何方法报价机制可用。为便于阅读,建议使用练习引用或转义所有文字空白和默认可忽略的代码点。

考虑以下示例,其中角度中的项目括号表示文字字符:

a<空格>b→x<零宽度空格>y+z;

因为<SPACE>是Pattern_White_SPACE字符需要引用。因为<ZERO WIDTH SPACE>是一个默认的可忽略字符,所以还应该引用它以提高可读性。所以在如果\uXXXX用于代码点文字,但在引用之前解决,如果使用单引号进行引用,该示例可以表示为:

“a\u0020b”→“x\u200By”+z;

5规范化和案例

本节讨论了必须考虑的问题在中考虑标识符的规范化和大小写折叠时编程语言或脚本语言。使用规范化避免了明显相同的标识符不存在的许多问题同等对待。这两种情况下都可能出现此类问题编译和链接期间,尤其是跨不同编程语言。为了避免此类问题,编程语言可以在存储或比较标识符之前对其进行规范化。一般情况下如果编程语言具有区分大小写的标识符,则规范化表C适用;然而,如果编程语言具有区分大小写的标识符,然后是标准化表单KC更合适。

考虑规范化和案例的实现有两种选择:将变体视为等效变量,或不允许变体。

UAX31-R4型等价物规范化标识符: 为了满足这一要求应规定规范化表格,并提供准确的从中排除的字符的规范规范化(如果有)。如果规范化表单为NFKC,则实施应适用第5.1节中的修改,NFKC修改,由属性XID_Start和XID_Continue。标识符除外包含排除的字符,任何两个标识符相同的规范化表应被视为等效的实施。

UAX31-R5型等价物不区分大小写标识符: 为了满足这一要求实施应规定简单或全箱折叠,以及遵循该折叠的Unicode规范。任何两个具有相同折叠形式的标识符应视为与实现等效。

UAX31-R6型已筛选标准化标识符: 为了满足这一要求应规定规范化表格,并提供准确的从中排除的字符的规范规范化(如果有)。如果规范化表单为NFKC,则实施应适用第5.1节中的修改,NFKC修改,由属性XID_Start和XID_Continue。标识符除外包含排除的字符,允许的标识符必须位于指定的规范化表单。

注:对于要求UAX31-R6,过滤包括不允许任何集合\p{NFKC_QuickCheck=No}中的字符,或等效地,不允许\P{isNFKC}。

UAX31-R7型已筛选不区分大小写标识符: 为了满足这一要求实施应规定简单或全箱折叠,以及遵循该折叠的Unicode规范。除了包含排除字符的标识符,允许的标识符必须以规定的箱子折叠形式。

注:符合要求的UAX31-R7,带全套折叠、过滤包括禁止集合中的任何字符\p{折叠时更改}

从Unicode 5.2开始,可以对用于匹配标识符:至NFKC_底座请参见UAX31-R5型在里面第3.13节,默认情况算法在里面[Unicode码]. 那次手术case折叠并规范化字符串,并删除默认的可忽略代码点。它可以用于支持等效情况和兼容性不敏感标识符有一个对应的布尔属性,Changes_When_NFKC_Casefold,可用于支持实施过滤案例和兼容性不敏感标识符。NFKC_Casefold字符映射属性和Changes_When_NFKC_Casefold属性以Unicode描述标准附录#44,“Unicode字符数据库”[UAX44型].

注:在面向数学的编程语言中特别使用数学字母数字符号,例如作为U+1D400数学粗体大写字母A,NFKC的应用程序必须过滤字符以排除具有属性值的字符分解类型=字体。

5.1NFKC公司修改

编程语言使用NFKC折叠差异的地方在字符之间,它们需要对Unicode标准中的标识符语法来处理少数字符的特性。这些修改在XID_Start和XID_Continue属性中反映。

5.1.1对行为类似组合标记的字符的修改

某些字符不是正式组合字符,尽管他们在大多数方面表现得像是。在大多数情况下,不匹配不会导致问题,但当这些字符兼容性分解,它们会导致标识符根据标准化表格KC关闭。特别是以下四个XID_Continue而非XID_Start中包含字符:

5.1.2不规则分解字符的修改

U+037A希腊语YPOGEGRAMMENI和某些阿拉伯语表达表单具有不规则的兼容性分解,因此被排除在外从XID_Start和XID_Continue。建议所有在任何情况下,阿拉伯表示形式都不包括在标识符中,尽管只有一小部分必须排除在外才能正常化保证标识符关闭。

5.1.3规范化下的标识符闭包

通过对标识符语法的这些修改,所有标识符都是在所有四个规范化表单下关闭。这意味着对于任何字符串S的含义如所示图5保持。

图5。规范化结束

是标识符(S) →  isIdentifier(到NFD(S))
isIdentifier(到NFC(S))
是标识符(toNFKD(S))
isIdentifier(到NFKC(S))

在案例操作中,标识符也将关闭。对于任何字符串S(除了涉及单个字符的例外)如所示图6保持。

图6。案件结案

is标识符(S) →  isIdentifier(小写(S))
isIdentifier(大写(S))
isIdentifier(到折叠式案例(S))

外壳的一个例外是U+0345组合灰色YPOGEGRAMMENI公司。在非常罕见的情况下,U+0345位于起点在S中,U+0345不在XID_Start中,但它的大写和折叠大小写版本为。在实践中,这不是问题,因为规范化用于标识符。

对于规范等价来说,相反的含义是正确的,但在兼容性等效的情况下为true:

图7。反向规范化结束

isIdentifier(到NFD(S))
isIdentifier(到NFC(S))
 → 是标识符(S)
是标识符(toNFKD(S))
isIdentifier(到NFKC(S))
 
 ↛ 是标识符(S)

有许多字符的反向含义不是适用于兼容性等效,因为有许多字符计数为符号或非十进制数,因此超出标识符——其兼容等价物为字母或十进制数字和标识符。一些示例如所示8

表8。等同于字母或十进制数的兼容性

代码点 GC公司 样品 姓名
2070 超级脚本零
20A8年 Sc公司 RUPEE标志
2116 所以 数字符号
2120..2122 所以 ℠.. 服务商标
2460.2473 ①..⑳ 圆圈数字一。。圆圈数字二十
3300..33A6型 所以 ㌀..㎦ 广场公寓。。平方公里立方码

如果实施需要确保以下两个方向标识符的兼容性等价性,然后是标识符需要定制定义以添加这些字符。

对于典型等价,这在两个方向上都是正确的。isIdentifier(到NFC(S))当且仅当是标识符(S)

Unicode 5.1之前有两个例外,如所示9。如果实现需要确保完全规范等效则必须定制标识符定义,以便这些字符具有相同的值,因此isIdentifier(S)和isIdentidater(toNFC(S))为true,或者两者都为true值为false。

表9。Unicode 5.1之前的标准等价异常

isIdentifier(toNFC(S))=真 isIdentifier(S)=假 不同于
02B9(ʹ)修改器字母底漆 0374(ʹ)希腊数字符号 XID和ID
00B7(·)中点 0387(·)格雷克·安诺·泰利娅 仅XID

那些具有区分大小写标识符的编程语言应该使用中描述的案例折叠第3.13节,违约案例算法,第页,共页[Unicode码]生成对大小写敏感的规范化形式。

当源文本被解析为标识符时区分(用例映射或NFKC)必须延迟到解析已找到标识符。因此区别不应应用于字符串文字或注释在程序源文本中。

Unicode标准支持标准化的案例折叠NFKC_Casefold(X)函数。参见中的定义UAX31-R5章节3.13,默认情况算法在[Unicode码]对于此函数的说明及其用法的进一步说明。

5.2案例和稳定性

标识符初始字符的字母大小写用作区分某些Prolog、Erlang、Haskell、Clean和Go等语言。例如,在Prolog和Erlang中,变量必须以大写字母(或下划线)和原子不能。使用这种机制。

为了使编程语言中的这种大小写区分有效使用单字符书写系统(如汉字或梵文),另一种机制(如下划线)需要替换套管区别。

套管稳定性也是双腔书写系统的一个问题。这个General_Category属性值的赋值(例如gc=Lu)不是保证稳定,也不能将字符分配给更广泛的属性,如大写字母。因此,这些属性值不能自己使用,不包含保持向后兼容性的机制,例如,在章节2.5向后兼容性也就是说,实施将保持其自己的特殊列表需要更新每个新版本的包含项和排除项Unicode的。

或者,编程语言规范可以使用中指定的操作案例折叠稳定性作为其套管区分的基础。那个操作保证稳定。也就是说,可以使用外壳区分,如以下内容:

  1. S是一个变量如果S以强调。
  2. 否则,生成S'=toCasefold(toNFKC(S))
    1. S是一个变量如果firstCodePoint(S)≠第一个代码点(S'),
    2. 否则S为原子

该测试显然可以针对正常情况进行优化,例如作为初始ASCII。还建议标识符位于NFKC中格式,这使得检测更加简单。

5.2.1边缘折叠箱

在Unicode 8.0中,切罗基语字母已更改从gc=Lo到gc=Lu,相应的小写字母(gc=Ll)有已添加。这是一个不寻常的模式;通常当案例对新增,现有字母从gc=Lo更改为gc=Ll,并新增添加了相应的大写字母(gc=Lu)。在以下情况下切罗基,人们认为这个解决方案提供了最多在字体方面与现有实现的兼容性治疗。

这种方法的缺点是切罗基字符,折叠案例时,将根据需要转换为8.0之前的版本字符,即大写版本。这种折叠不同Unicode中的任何其他大小写映射字符。因此切罗基字符串的大小写折叠版本将包含大写字母而不是小写字母。与字体的兼容性人们认为当前的用户社区比案例折叠的边缘案例带来的混乱,因为切罗基编程标识符将很少见。

结果是,当涉及到标识符时,实现不应使用General_Category或Lowercase或用于测试套管条件的大写属性,也不使用到Uppercase()、到LowerCase()或到Titlecase()以折叠或测试标识符。相反,他们应该使用Case_Folding或NFKC_折叠。

6井号标签标识符

哈希标签标识符在社会化媒体。它们由字符串前面的数字符号组成字符,例如表情符号。允许的实际组成Unicode哈希标签标识符因供应商而异。它也有hashtag通常包含表情符号,而不包含明确包含哪些字符。

本节介绍了可以使用的语法用于解析Unicode哈希标签标识符以提高互操作性。

UAX31-D2型违约哈希标记标识符语法:

<哈希标记标识符>:=<开始><继续>*(<中间><继续>+)*

在分析流动文本中的哈希标签时建议仅当存在扩展Hashtag时才能识别开始字符之前没有Continue字符。例如,在“abc#def”中没有哈希标签,而“abc”中则有哈希标签#def”或“abc.#def”。

UAX31-R8型扩展哈希标记标识符: 为了满足这一要求,确定字符串是哈希标签标识符,实现应选择其中之一UAX31-R8-1型UAX31-R8-2型

UAX31-R8-1型使用定义UAX31-D2型,设置:

  1. 开始:=[###]
    • U+0023数字标志
    • U+FE5F小号标志
    • U+FF03全宽数字标志
    • (这些是#及其兼容等效项。)
  2. Medial当前为空,但可以用于自定义。
  3. Continue:=XID_Continue,加上Extended_Pictographic、Emoji_Component和“_”、“-”、“+”,减去开始字符。
    • 注意#个字符的减法。
    • 这用UnicodeSet表示法表示为:
      [\p{XID_Continue}\p{Extended_Picturography}\p}表情符号组件}[-+_]-[###]]

UAX31-R8-2型声明:它使用轮廓属于UAX31-R8-1型如中所示UAX31-R1系列

表情符号属性来自的相应版本[UTS51标准]. 表情符号属性的版本与Unicode标准的版本相关联,从版本11.0开始。

第2.5节中提到的技术向后兼容性可能是用于需要连续版本之间稳定性的地方。

应在转换为NFKC_CF格式后进行比较和匹配。因此,#MötleyCrüe应该与#MtleyCrüe和其他变体相匹配。

实现可以选择在中添加字符表3a,Medial的可选字符内侧表3b,用于Continue的可选字符继续为自然语言提供更好的标识符。

7标准配置文件

提供了两个默认标识符的标准配置文件,以满足在具有较少限制的标识符语法的编程语言中观察到的常见使用模式,包括使用UAX31-R2默认标识符的语言:在标识符中包含适合数学用法的字符,以及在标识符中包括表情符号。

这些概要文件与需求概要文件相关联UAX31-R3b型

此外,还提供了一个标准概要文件,以从标识符中排除默认可忽略的代码点。这些字符在大多数情况下都没有明显的效果,可能会导致欺骗问题;看见第2.3节,布局和格式控制字符

有关这些配置文件对编程语言的适用性的指导,请参阅Unicode技术标准#55,“Unicode源代码处理”[UTS55标准].

7.1数学兼容性符号配置文件

默认标识符的数学兼容性符号配置文件包括将集合[:ID_Compat_Math_Start:]添加到集合中启动,并将集合[:ID_Compat_Math_Continue:]设置为该集合继续,在定义中UAX31-D1型

注:集合[:ID_Compat_Math_Start:]包括½、及其数学样式变量以及∞。集合[:ID_Compat_Math_Continue:]包括[:ID_Compat_Math开始:],以及具有数学用途的下标和上标数字和符号。

它与的配置文件关联无人机31-R3b,包括从具有语法用途的字符集中删除[[:Pattern_Syntax:]-[:ID_Compat_Math_Continue:]]中的字符(这些字符是字符Ş、Ş和∞)。

注:While期间支持的建议将这些字符用于某些计算机语言,因为它们在某些应用程序中可能很有用。与默认标识符中允许的许多其他字符一样,这些字符在一般情况下不鼓励使用,因为它们会让大多数读者感到困惑。参见Unicode技术标准#55,“Unicode源代码处理”[UTS55标准].

7.2Emoji简介

默认标识符的表情符号配置文件提供在标识符中包含表情符号字符和序列。一些编程语言已经支持表情符号的大子集,但此配置文件提供了一种机制,可以将其作为语言词汇结构的一部分进行一致处理。

默认标识符的Emoji配置文件包括:

  1. 在Unicode技术标准#51“Unicode emoji”中添加了ED-27定义的RGI表情符号集[UTS51标准]对于给定版本的Unicode启动继续在定义中UAX31-D1型
  2. 从集合中删除代码点U+FE0E VARIATION SELECTOR-15(文本表示选择器)继续
注:Emoji Profile要求在集合中使用字符序列,而不是单个代码点启动继续由定义UAX31-D1型。使用此配置文件时,请使用U+002A星号(*)、U+203C双感叹号(‼)或U+263A白色笑脸(☺) 不是合法标识符,而是序列(U+002A、U+FE0F、U+20E3)*️⃣, (U+203C,U+FE0F)和(U+263A,U+FE0F)☺️ 标识符中允许。这将需要对lexer进行一些更改:当它们遇到启动表情符号序列的字符时,它们将(逻辑上)切换到不同的解析机制。

表情符号配置文件包括Pattern_Syntax中的字符;因此,它与的配置文件关联UAX31-R3b型,它包括将[:Pattern_Syntax:]的某个子集的每个表情符号字符替换为文本表示序列(ED-8a):

  1. 从使用语法的字符集中删除集合[[:Pattern_Syntax:]&[:Emoji_Presentation:]]中的字符。
  2. 对于[[:Pattern_Syntax:]&[:Emoji_Presentation:]]中的所有C,将由C后跟U+FE0E VARIATION SELECTOR-15(文本表示选择器)组成的序列添加到具有语法用途的字符集中。

此外,为了避免标识符和运算符之间的词汇歧义,Emoji Profile包含一个用于UAX31-R3c型,包括从集合中删除字符U+FE0F VARIATION SELECTOR-16(表情符号表示选择器)继续

例子:考虑一种符合要求的语言UAX31-R3b型UAX31-R3c型没有配置文件。U+2615热饮(☕) 是一个具有句法用途的字符,因此它是一个运算符。当使用Emoji Profile满足这些要求时,U+2615热饮(☕) 不是具有语法用途的字符(允许它成为标识符字符),并且不是有效的运算符。然而,序列U+2615 U+FE0F(☕︎) 被添加到具有句法用途的字符集,因此☕︎ 是有效的运算符。

此更改意味着,如果在采用Emoji配置文件之前,具有Emoji_Presentation属性的某些Pattern_Syntax字符在语法上使用(例如,在运算符中),则一旦采用了配置文件,这些字符就会成为标识符,但可以通过添加U+FE0E VARIATION SELECTOR-15(允许迁移路径)将其转换回运算符。

当然,如果编程语言只使用不包含这些字符的Pattern_Syntax字符子集,则无需采取任何操作。

Pattern_Syntax中的其他一些字符(例如↔) 在表情符号中使用(例如↔️), 但它们本身并不是表情符号,因此只要词汇分析适当地考虑到序列,就不需要从句法使用的字符集中删除它们。

表情符号序列需要98个默认可识别字符:

因此,如果此配置文件与删除默认可忽略字符的任何配置文件(如default-ignorable Exclusion profile)组合,则需要在表情符号序列的上下文中保留这些字符。

用符合要求的语言考虑以下示例UAX31-R1系列同时使用Emoji配置文件和默认的可忽略排除配置文件:

顺序外观法律标识符?原因
A+ZWJ+BA和BZWJ不是表情符号序列的一部分
U+1F408+ZWJ+U+2B1B🐈‍⬛是的ZWJ是表情符号序列的一部分(用于黑猫)
大+U+1F408+ZWJ+U+2B1B🐈‍⬛是的

7.3默认可忽略排除配置文件

默认标识符的默认可忽略排除配置文件包括从集合中排除属性为default_ignorable_code_Point的代码点启动继续在定义中UAX31-D1型

注:虽然它减少了攻击面,但排除默认可忽略的代码点并不能防止欺骗问题。Unicode技术标准#39“Unicode安全机制”中描述了更全面的机制[UTS39标准]; 特别是,排除默认可忽略的代码点是标识符概要文件的一部分。
注:如果有更高级别的诊断,例如在编程环境中,可以采取更有针对性的措施,以便仍然允许合法使用这些字符。参见Unicode技术标准#55,“Unicode源代码处理”[UTS55标准].

致谢

Mark Davis是最初版本的作者,并添加了并保留了本附件的文本。罗宾·勒罗伊(Robin Leroy)从15.0版开始帮助更新了它。

源代码工作组会议的与会者对15.0版和15.1版中的重大更改提供了帮助:彼得·康斯特布尔,埃尔纳·达克舍夫,马克·戴维斯,巴里·多兰斯,史蒂夫·道尔,迈克尔·范宁,阿斯穆斯·弗雷塔格,但丁·加涅,里奇·吉勒姆,Manish Goregaokar,汤姆·霍尔曼,简·拉霍达,内森·劳伦斯,罗宾·勒罗伊,克里斯·里斯,马库斯·谢勒,理查德·史密斯。

感谢埃里克·穆勒、阿斯穆斯·弗雷塔格、丽莎·摩尔、朱莉·艾伦、乔纳森·沃登、肯尼思Whistler、David Corbett、Klaus Hartke、Martin Dürst、Deborah Anderson、Steve Downey、Ned Holbrook、Corentin Jabot、Shang Liang Hai、Jens Maurer和Hubert Tong就本附件提供反馈意见。

工具书类

有关本附件的参考,请参阅Unicode标准附件#41,“Unicode的通用参考标准附件.”

迁移

版本15.1

要求UAX31-R1a限制格式字符已被撤回。

如果声称符合UAX31-R1a的实现希望保留ZWJ和ZWNJ的上下文检查,则应参考Unicode技术标准#39中的通用安全配置文件“Unicode安全机制”[UTS39标准].

在以前的版本中,要求UAX31-R3 Pattern_White_Space和Pattern_Syntax字符不需要对空白字符进行任何特殊解释。它现在指定哪些字符将被视为行终止符、水平空格和可忽略格式控件。句法用法的含义也得到了澄清。

声称符合UAX31-R3的实现应检查它们是否按照中的描述解释Pattern_White_Space中的字符UAX31-R3a模式_白色_空格字符,并且他们对Pattern_Syntax字符的使用与UAX31-R3b模式_语法字符

版本15.0

在以前的版本中,注释解释了如何实现需求UAX31-R7过滤的不区分大小写标识符完整的案例折叠引用了错误的属性,而要求本身错误地引用了规范化表单,而不是案例折叠表单。

声称符合UAX31-R7的实现应检查它们是否使用了正确的属性。

版本13.0

版本13.0更改了表4的结构。排除的脚本重要的是,删除了不基于脚本的条件。基于表4的实现应参考UTS#39,Unicode安全机制[UTS39标准]用于其他限制。

11.0版

版本11.0改进了ZWJ在标识符中的使用(增加了一些限制,稍微放宽了其他限制),并在一定程度上扩展了哈希标签标识符的定义。有关详细信息,请参阅修改

9.0版

在以前的版本中,文本倾向于使用XID_Start和XID_Continue,如下段所示。然而,形式定义使用了ID_Start和ID_Continue。

XID_Start和XID_Continue属性改进了词法包含中所述更改的类章节5.1,NFKC修改出于大多数目的,特别是出于安全考虑,建议使用它们,覆盖原始ID_Start和ID_Continue属性。

在版本9.0中,这是交换的,而X版本是在形式定义中明确说明。这只影响以下字符。

037A;希腊YPOGEGRAMMENI
0E33;泰语字符SARA AM
0EB3;LAO VOWEL AM标志
309B;KATAKAN-HIRAGANA发声声音标记
309C;KATAKAN-HIRAGANA半人声标记
FC5E。。FC63;带超脚本ALEF隔离的阿拉伯红帽表格
FDFA;阿拉伯连词SALLALLAHOU ALAYHE WASALLAM
FDFB;阿拉伯连语JALLAJALALOUHOU
FE70;阿拉伯法塔坦隔离模板
FE72;阿拉伯大坝隔离表格
FE74;阿拉伯KASRATAN隔离型
FE76;阿拉伯法塔赫隔离形式
FE78;阿拉伯大坝隔离表格
FE7A;阿拉伯KASRA隔离型
FE7C;阿拉伯SHADDA隔离型
FE7E;阿拉伯SUKUN隔离表格
FF9E;半幅KATAKANA声音标记
FF9F;半宽KATAKANA半人声音标

希望维护的实现符合旧的建议只需要声明一个配置文件其使用ID_Start和ID_Continue而不是XID_Start和XID_Continue。

9.0版将旧的表3从8.0版拆分为3部分。

当前表格 统一码8.0
表3,开始的可选字符 表3,ID_Continue中包含的候选字符
表3a,Medial的可选字符
表3b,用于Continue的可选字符 仅在文本中概述

6.1版

在Unicode版本5.2、6.0和6.1之间,表5分为三个。在版本6.1中,结果表被重新编号为更容易参考。标题和链接保持不变稳定性。

以下是对应关系:

当前表格 Unicode 6.0标准 Unicode 5.2标准
表5,推荐的脚本 第5页 5
表6,渴望式使用脚本
表7,有限使用脚本 5亿
表8,等同于字母或十进制数的兼容性 6 6
表9,Unicode 5.1之前的标准等价异常 7 7

修改

以下总结了对先前发布版本的修改本附件的要求。

第39次修订

先前版本的修改在相应版本中列出。