我有一个方法可以检测字符串中的URL,并返回URL和可以找到它们的范围。一切都很完美,直到字符串上有表情符号。例如:
"I'm gonna do this callenge as soon as I can swing again 😂😂😂\n http://youtu.be/SW_d3fGz1hk"
由于emoji,从文本中提取的url是http://youtu.be/SW_d3fGz1而不是http://youtu.be/SW_d3fGz1hk。我认为最简单的解决方案是用空格字符替换字符串上的表情符号(因为我需要一些文本样式的范围是正确的)。问题是,这在Swift中非常难实现(很可能我缺乏Swift String API的能力)。
我一直在尝试这样做,但似乎我不能从一个unicode点数组创建一个字符串:
var emojilessStringWithSubstitution: String {
let emojiRanges = [0x1F601...0x1F64F, 0x2702...0x27B0]
let emojiSet = Set(emojiRanges.flatten())
let codePoints: [UnicodeScalar] = self.unicodeScalars.map {
if emojiSet.contains(Int($0.value)) {
return UnicodeScalar(32)
}
return $0
}
return String(codePoints)
}
我处理这个问题的方法是错误的吗?更换emoji是最好的解决方案吗?如果是这样,我该怎么做?
8条答案
按热度按时间cidc1ykv1#
*Swift 5酒店
不要使用这种
hardcoded
方式来检测emojis
。在Swift 5
中,您可以轻松地做到这一点eufgjt7s2#
您可以使用模式匹配(用于emoji模式)从
String
中过滤掉emoji字符。请注意,上面的方法只使用了问题中的表情符号间隔,并不代表所有的表情符号,但该方法是通用的,可以通过将其他表情符号间隔添加到
emojiPatterns
数组中来快速扩展。我意识到再次阅读你的问题,你更喜欢用空格字符替换表情符号,而不是删除它们(上面的过滤解决方案)。我们可以通过将上面的
.filter
操作替换为条件返回.map
操作来实现这一点,与您的问题非常相似如上所述,根据您对这篇文章的评论(列出这些间隔),现有的emoji间隔已被扩展,因此emoji检查现在可能是详尽的。
velaa5lx3#
Swift 4:
dbf7pr2w4#
Emoji被Unicode分类为符号。字符集通常用于搜索操作。所以我们将使用字符集的属性是符号.
输出为
现在观察emoji被一白色所取代,因此有两个空格,我们用以下方式替换它
上述方法替换参数:“两白色”要与:“单白色”
kcugc4gi5#
获取所有emoji比你想象的要复杂得多。有关如何找出哪些字符是emoji的更多信息,请查看这篇stackoverflow文章或this article。
基于这些信息,我建议使用Character的扩展来更容易地让我们理解哪些字符是emoji。然后添加一个字符串扩展名,以便轻松地将找到的emoji替换为另一个字符。
使用它将简单地变成:
cyej8jka6#
我发现上面给出的解决方案对某些字符不起作用,例如🏋️🏻♂️和🧰。
为了找到emoji的范围,我使用regex将full list of emoji characters转换为一个只有十六进制值的文件。然后我把它们转换成十进制格式并排序。最后,我写了一个脚本来查找范围。
这是
isEmoji()
的最终Swift扩展。作为参考,这里是我编写的Python脚本,用于将十六进制字符串解析为整数,然后查找范围。
convert-hex-to-decimal。py
make-ranges。py
hlswsv357#
这个Swift 5的代码片段对我来说很有魅力,但我还没有检查过所有的表情符号。然而它仍然显示中国,韩国等我以前的解决方案挣扎。
llmtgqce8#
不要硬编码表情符号的范围,而是使用这个。