与包含它们的字符集进行比较时,只有 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 个表情符号返回错误的长度的主要内容,如果未能解决你的问题,请参考以下文章