Swift 4 (Xcode 9) 更新
从 Swift 4 开始(使用 Xcode 9 beta 进行测试),按照 Unicode 9 的规定,每隔两个区域指示符符号就会中断字素簇
标准:
let str1 = "????????????????????????????????????????"
print(str1.count) // 5
print(Array(str1)) // ["????????", "????????", "????????", "????????", "????????"]
Also String
是它的字符的集合(再次),所以人们可以
获取字符数str1.count
.
(Swift 3 及更早版本的旧答案:)
From 《3个字素簇边界》 http://www.unicode.org/reports/tr29/#Grapheme_Cluster_Boundaries在“标准附件#29 UNICODE 文本分段”中:
(强调):
遗留字素簇被定义为基(例如A或カ)
后跟零个或多个连续字符。一种思考方式
这是形成“堆栈”的字符序列。
碱基可以是单个字符,也可以是 Hangul Jamo 的任何序列
构成 Hangul 音节的字符,如 The D133 所定义
Unicode 标准,或者是任意区域指示符 (RI) 字符序列。 RI 字符成对使用来表示 Emoji
与 ISO 国家代码相对应的国旗符号。的序列
超过两个 RI 字符应该用其他字符分隔,
例如U+200B ZWSP。
(感谢@rintaro 提供的链接)。
一个 Swift Character 代表一个扩展的字素簇,所以它是(根据
到此参考)更正区域指示符号的任何序列
被计为单个字符。
您可以通过零宽度非连接器分隔“标志”:
let str1 = "????????\u{200C}????????"
print(str1.characters.count) // 2
或插入零宽度空格:
let str2 = "????????\u{200B}????????"
print(str2.characters.count) // 3
这也解决了可能的歧义,例如应该是“????????????????”
是“????????????????”还是“????????????????”?
也可以看看如何知道两个表情符号是否会显示为一个表情符号? https://stackoverflow.com/questions/39104152/how-to-know-if-two-emojis-will-be-displayed-as-one-emoji关于一个可能的方法
计算 Swift 字符串中“组合字符”的数量,
这会返回5
为您let str1 = "????????????????????????????????????????"
.