Ios Swift countElements()在计数标志表情符号时返回不正确的值 let str1=“

Ios Swift countElements()在计数标志表情符号时返回不正确的值 let str1=“,ios,swift,unicode,emoji,countelements,Ios,Swift,Unicode,Emoji,Countelements,更新Swift 4(Xcode 9) 从Swift 4(使用Xcode 9 beta测试)开始,按照Unicode 9的规定,每秒钟区域指示符号之后,图形集簇就会中断 标准: let str1=“以下是我如何解决这个问题的,对于Swift 3: let str=“是的,这很奇怪。我尝试过不同的表情符号,但只有标志表情符号会导致这种情况。即使使用不同的没有空格的标志也会导致这种情况。在我看来,这就像是一个bug。”似乎任意序列的“区域指示符号字母”被视为一个单一的图形集群。例如,let str1=

更新Swift 4(Xcode 9)

从Swift 4(使用Xcode 9 beta测试)开始,按照Unicode 9的规定,每秒钟区域指示符号之后,图形集簇就会中断 标准:


let str1=“以下是我如何解决这个问题的,对于Swift 3


let str=“是的,这很奇怪。我尝试过不同的表情符号,但只有标志表情符号会导致这种情况。即使使用不同的没有空格的标志也会导致这种情况。在我看来,这就像是一个bug。”似乎任意序列的“区域指示符号字母”被视为一个单一的图形集群。例如,
let str1=“\u{1F1E6}\u{1F1E7}\u{1F1E8}\u{1F1E9}\u{1F1EA}\u{1F1EB}”
打印为
有趣的是,
str1.startIndex.successor()==str1.endIndex
我无法理解,但这里有一个很好的捕获!现在,我们很想知道他们为什么这样设计它,因为它是一个疣。@rintaro:这里是另一个例子:
let a=“J\u{1F1EF}”;设b=“\u{1F1F5}P”
。然后
3=countElements(a+b)
-我的解释是:
c=a+b
连接字符串的Unicode标量值,而不是字符。因此,
c
可能具有
a
b
中不存在的图形集簇。Randy,这不是Swift的错,因为它正确地实现了Unicode标准。Unicode联盟面临的问题是如何确定区域指标之间的差距。有三个基本选项:寻找第一个指标,每两个指标计数一次(可能较慢);用一个不可见的字符将两个指示器粘在一起;或使用不可见字符拆分成对的指示器。他们最终选择了选项3。@sudo请注意,标准上说“应该用其他字符分隔”。换言之,没有人会因为省略了这些分隔符而违反标准。在大多数情况下,无论如何都没有必要这样做。不过,它确实有助于消除歧义。我没有时间研究这个问题,但我似乎记得可可文本系统有自己的逻辑来确定字符边界,即。E与NSString分开(或加上NSString),当然也与Swift String分开。值得注意的是,从Unicode 9.0.0和Unicode标准附录29开始,规则已经改变。在区域指示符号序列中,每秒钟区域指示符号后,图形集簇都会断开。我不知道Swift是否实施了新规则。比较(我在回答中链接到):)