只有 2 个表情符号 return 与包含它们的字符集相比长度不正确

Only 2 emoji return an incorrect length when compared against a character set containing them

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 设置为大多数面部表情符号时,运行ge 返回为长度为 2,并且子字符串可以在其他地方适当使用。只有 2 个面部表情符号 - “smiling face" emoji and "frowning face”表情符号,运行ge 返回长度为 1。在所有情况下,字符串的长度返回为 2。具有给定的子字符串运行ge of 1 是不完整的,你可以看到将其返回到 myString 进行比较,例如将其与自身进行比较,结果为 false。这 2 个表情符号的 运行ge 结果应该是 2.

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

这似乎是一个 iOS 错误。我想不出我个人在这里做错了什么,因为它适用于所有其他表情符号。

很难回答,但有很多内容适合评论,所以请耐心等待 :)

我不知道您是否已经看过这个,但我认为您的问题已在 WWDC 2017 (https://developer.apple.com/videos/play/wwdc2017/102/) 的平台联盟演讲中解决Swift 4.

如果您在大约 23 分 12 秒处观看视频,您会看到 Ted Kremenek 谈论他们如何使用 Unicode 9 Grapheme Braking 解决 Swift 4 中预期的分隔 unicode 字符的问题.

另外,看看

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