Swift中字符串的标准等价

标准等价是指两个Unicode标量序列在语言学层面是否相等。对于两个字符或字符串,如果他们具备相同的语言学含义和外观,那么无论是否使用相同的Unicode标量创建,都认为两者相等。

从内部实现上来说,Swift字符串是由Unicode标量实现的,Unicode标量是21位的数,表示Unicode标准中的一个特定字符。一个字符是有一个或多个Unicode标量构成的。多个Unicode标量组成的字符被称作组合标量。

比如,U+0301表示可组合的重音符号(‘),这个标量与它前面的字符组合,将重音符号放在它前面的标量所对应的字符上面。

1
let aAcute = "\u{0061}\u{0301}"	//aAcute表示à

但在Unicode标准中,已经为à提供了组合过的形式,有一个专属的标量,实际上不用分为字母和重音符号两部分。

1
2
3
4
let aAcute = "\u{0601}\u{0301}"
let aAcutePrecomposed = "\u{00E1}"
let b = (aAcute == aAcutePrecomposed)
//b为真

aAcuteaAcutePrecomposed都表示à,所以这两个字符串是标准等价的。

标准等价对于字符串长度的计算是有影响的。

1
print("aAcute.length : \(aAcute.characters.count);aAcutePrecomposed.length : (aAcutePrecomposed.characters.count)")

运行结果两个字符串长度都是1个字符。所以标准等价意味着无论是用组合标量还是预组合标量,结果都会被当成单个字符。