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

Posted

技术标签:

【中文标题】与包含它们的字符集进行比较时,只有 2 个表情符号返回错误的长度【英文标题】:Only 2 emoji return an incorrect length when compared against a character set containing them 【发布时间】:2017-11-07 06:56:32 【问题描述】:
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 String 或 Range 具有完全相同的行为。

当我将 myString 设置为大多数面部表情符号时,范围返回为长度为 2,并且子字符串可以在其他地方适当使用。只有 2 个面部表情符号 - “smiling face”表情符号和“frowning face”表情符号,范围返回为 1。在所有情况下,字符串的长度返回为 2。具有给定的子字符串1 的范围是不完整的,您可以看到将其与 myString 进行比较(作为将其与自身进行比较的示例)给出的结果为 false。这 2 个表情符号范围的结果应该是 2。

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

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

【问题讨论】:

??????????????????????????????这个表情符号(符号)还是别的什么? 这很可能是 UTF-16 代码单元的数量。笑脸和皱眉脸是 U+2639 和 U+263A(在 BMP 中),其他表情符号在表情符号范围内(U+01F600 到 U+01F64F)。 【参考方案1】:

几乎没有一个答案,但可以放入评论中,所以请耐心等待:)

我不知道你是否已经看过这个,但我认为你的问题已在 WWDC 2017 (https://developer.apple.com/videos/play/wwdc2017/102/) 的平台国情咨文演讲中关于 Swift 4 的新功能部分得到解决。

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

另外,看看this question and answer。

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

【讨论】:

以上是关于与包含它们的字符集进行比较时,只有 2 个表情符号返回错误的长度的主要内容,如果未能解决你的问题,请参考以下文章

计算表情符号的字符长度?

在 Flutter 上显示带有表情符号的文本

如何使用python在字符串中查找和计算表情符号?

如何将包含表情符号的字符串拆分为数组?

使用扩展语法从包含表情符号的字符串中过滤空字符串

emoji纸飞机表情符号怎么输入