gpt4 book ai didi

ios - 用 Twitter 开源 twemoji 替换 iOS 应用 emoji

转载 作者:行者123 更新时间:2023-12-01 16:39:55 46 4
gpt4 key购买 nike

我想用 Twitter 开源 twemoji 替换 UILable 或 UITextView 中的所有标准 iOS 表情符号.

我找不到任何库或文档可以在 iOS 中执行此操作。有没有人有一个解决方案,不需要我从头开始实现这个?

解决方案需要高效且可以离线工作。

最佳答案

这个问题引起了我的兴趣,在对如何用自定义集替换所有标准 iOS 表情符号进行了一些搜索之后,我注意到即使是 Twitter 自己的 iOS 应用程序也无法做到这一点使用 Twemoji:

tweet

最后我得出了和你一样的结论:

I can't find any library or documentation to do this in iOS.

所以,我创建了 a framework in Swift正是为了这个目的。

它会为您完成所有工作,但如果您想实现自己的解决方案,我将在下面描述如何用 Twemoji 替换所有标准表情符号。

<小时/>

1。记录所有可以表示为表情符号的字符

有 1126 个基本字符具有表情符号表示形式,以及超过 1000 个由序列形成的附加表示形式。尽管大多数基本字符仅限于六个 Unicode blocks ,除了其中一个 block 之外,所有这些 block 都与非表情符号字符和/或未分配的代码点混合。这些 block 之外的剩余基本字符分散在各个其他 block 中。

我的实现只是声明这些字符的 UTF-32 代码点,因为 UnicodeScalarvalue 属性正是如此。

2。检查某个字符是否是表情符号

在 Swift 中,String 包含 Character 对象的集合,每个对象代表一个 extended grapheme cluster 。扩展字素簇是一系列 Unicode 标量,它们一起表示一个1 个人类可读字符,这很有用,因为您可以循环遍历字符串的字符并处理它们基于它们包含的 UnicodeScalar(而不是 looping through the UTF-16 values of the string )。

要识别字符是否是表情符号,只有第一个UnicodeScalar很重要,因此将此值与表情符号字符表进行比较就足够了。不过,我还建议检查 Character 是否包含 Variation Selector ,如果是,请确保它是 VS16 - 否则该角色不应显示为表情符号。

Character 中提取 UnicodeScalar 需要一个小技巧:

let c: Character = "A"
let scalars = String(c).unicodeScalars

3。将代码点转换为正确的格式

Twemoji图像根据其对应的代码点2命名,这是有道理的。因此,下一步是将 Character 转换为与图像名称等效的字符串:

let codePoint = String("🙃").unicodeScalars.first!.value  // 128579
let imageName = String(codePoint, radix: 16) // "1f643"

很好,但这不适用于 flagskeycaps ,因此我们必须修改代码以将这些考虑在内:

let scalars = String("🇧🇪").unicodeScalars
let filtered = scalars.filter{ $0.value != 0xfe0f } // Remove VS16 from variants, including keycaps.
let mapped = filtered.map{ String($0.value, radix: 16) }
let imageName = mapped.joined(separator: "-") // "1f1e7-1f1ea"

4。替换字符串中的表情符号

为了替换给定String中的表情符号,我们需要使用NSMutableAttributedString来存储原始字符串,并用NSTextAttachment替换表情符号 包含相应 Twemoji 图像的对象。

let originalString = "🙃"

let attributedString = NSMutableAttributedString(string: originalString)

for character in originalString.characters {
// Check if character is emoji, see section 2.
...

// Get the image name from the character, see section 3.
let imageName = ...

// Safely unwrapping to make sure the image exists.
if let image = UIImage(named: imageName) {
let attachment = NSTextAttachment()
attachment.image = image

// Create an attributed string from the attachment.
let twemoji = NSAttributedString(attachment: attachment)

// Get the range of the character in attributedString.
let range = attributedString.mutableString.range(of: String(character))

// Replace the emoji with the corresponding Twemoji.
attributedString.replaceCharacters(in: range, with: twemoji)
}
}

要显示生成的属性字符串,只需将其设置为 UITextView/UILabelattributedText 属性即可。

请注意,上述方法没有考虑zero-width joinersmodifier sequences ,但我觉得这个答案已经太长了。

<小时/>

1. Character 类型有一个怪癖,它将一系列连接的区域指示符符号解释为一个对象,尽管理论上包含无限数量的 Unicode 标量。在 Playground 尝试 "🇩🇰🇫🇮🇮🇸🇳🇴🇸🇪".characters.count

2. 当涉及到零宽度连接器和变体选择器时,命名模式略有不同,因此更容易将它们从图像名称中删除 – see here.

关于ios - 用 Twitter 开源 twemoji 替换 iOS 应用 emoji,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40663230/

46 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com