与包含它们的字符集进行比较时,只有2个表情符号返回不正确的长度

时间:2017-06-06 09:59:33

标签: ios swift string unicode emoji

let myString = "☺️"

let emoji = "☺️☹️"

let characterSet = CharacterSet(charactersIn: emoji)

let range = (myString as NSString).rangeOfCharacter(from: characterSet)
(myString as NSString).substring(with: range)
(range as NSRange).location
(range as NSRange).length
(myString as NSString).length

substring == myString

此代码可以在Playgrounds中运行。尝试将myString更改为任何表情符号。

我在这里使用NSString和NSRange,因为它们的值更容易演示,但这与Swift字符串或范围具有完全相同的行为。

当我将myString设置为大部分face emojis时,范围返回为长度为2,子字符串可以在其他地方正确使用。只有2个面部表情符号 - " smiling face"表情符号和" frowning face"表情符号,范围以1的长度返回。在所有情况下,字符串的长度返回为2.给定范围为1的子字符串不完整,您可以看到将其与myString进行比较,作为将其与自身进行比较的示例,给出了错误的结果。这两个表情符号范围的结果应为2。

有趣的是,看看unicode规范,这两个表情符号与其邻居的unicode值大不相同。

这似乎可能是iOS错误。我无法想到我在这里可能做错的任何事情,因为它适用于所有其他表情符号。

1 个答案:

答案 0 :(得分:1)

几乎没有答案,但要适应评论,请耐心等待我:)

我不知道您是否已经看过这个问题,但我认为您的问题已在2017年WWDC(https://developer.apple.com/videos/play/wwdc2017/102/)的平台状态谈话中解决了什么是Swift 4中的新功能。

如果你在23分12秒左右观看视频,你会看到Ted Kremenek谈到他们如何使用Unicode 9 Grapheme Braking将Swic 4中的unicode字符分离出去。 / p>

另外,请查看this question and answer

是的......不要详细询问我这一切意味着什么,但似乎他们正在研究它:)