知识卡片

扩展字形簇是Swift字符的设计单位

专业/工作 · 742

内容

Swift字符串底层由21位的Unicode标量(如U+0061表示字母a)组成,但Character类型并不等于单个标量,而是”扩展字形簇”——一个或多个标量组合成的、人类视觉上认为是”一个字符”的单位。例如重音字母á既可以用一个预组合标量U+00E1表示,也可以用字母a的标量加组合重音符号标量U+0301拼出来,两种写法在Swift里被判定为同一个Character。这背后是”标准等价”规则:只要语言学含义和外观相同,无论底层标量组合方式如何都视为相等,count等字符计数属性也按此口径统一计算。发散:这说明”字符”这个概念在不同抽象层有不同定义——字节层、Unicode标量层、人类可读字符层——选错层次做字符串处理是很多国际化bug的根源。

参考来源

《Swift编程权威指南》第7章《字符串》