- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想用 Twitter 开源 twemoji 替换 UILable 或 UITextView 中的所有标准 iOS 表情符号.
我找不到任何库或文档可以在 iOS 中执行此操作。有没有人有一个解决方案,不需要我从头开始实现这个?
解决方案需要高效且可以离线工作。
最佳答案
这个问题引起了我的兴趣,在对如何用自定义集替换所有标准 iOS 表情符号进行了一些搜索之后,我注意到即使是 Twitter 自己的 iOS 应用程序也无法做到这一点使用 Twemoji:
最后我得出了和你一样的结论:
I can't find any library or documentation to do this in iOS.
它会为您完成所有工作,但如果您想实现自己的解决方案,我将在下面描述如何用 Twemoji 替换所有标准表情符号。
<小时/>有 1126 个基本字符具有表情符号表示形式,以及超过 1000 个由序列形成的附加表示形式。尽管大多数基本字符仅限于六个 Unicode blocks ,除了其中一个 block 之外,所有这些 block 都与非表情符号字符和/或未分配的代码点混合。这些 block 之外的剩余基本字符分散在各个其他 block 中。
我的实现只是声明这些字符的 UTF-32 代码点,因为 UnicodeScalar
的 value
属性正是如此。
在 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
Twemoji图像根据其对应的代码点2命名,这是有道理的。因此,下一步是将 Character
转换为与图像名称等效的字符串:
let codePoint = String("🙃").unicodeScalars.first!.value // 128579
let imageName = String(codePoint, radix: 16) // "1f643"
很好,但这不适用于 flags或keycaps ,因此我们必须修改代码以将这些考虑在内:
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"
为了替换给定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
/UILabel
的 attributedText
属性即可。
请注意,上述方法没有考虑zero-width joiners或modifier sequences ,但我觉得这个答案已经太长了。
<小时/>1. Character
类型有一个怪癖,它将一系列连接的区域指示符符号解释为一个对象,尽管理论上包含无限数量的 Unicode 标量。在 Playground 尝试 "🇩🇰🇫🇮🇮🇸🇳🇴🇸🇪".characters.count
。
2. 当涉及到零宽度连接器和变体选择器时,命名模式略有不同,因此更容易将它们从图像名称中删除 – see here.
关于ios - 用 Twitter 开源 twemoji 替换 iOS 应用 emoji,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40663230/
我正在使用这个库 https://www.npmjs.com/package/twemoji并且不知道如何转换这样的字符串 'I \u2764\uFE0F emoji!' 不 I emoji! 但是
我正在尝试使用 twemoji ( https://github.com/twitter/twemoji ) 转换 unicode 表情符号字符。 我有一个非常简单的页面:
所以我在这里设置了一个代码笔来演示我的问题:http://codepen.io/anon/pen/yNYzXx var emojiString = "I \u2764\uFE0F emoji!";
我正在使用 twemoji在页面上设置表情符号的样式: $(document).ready(function () { document.body = twemoji.parse(documen
我正在使用图书馆 twemoji在我的项目中。 现在,GitHub 中的示例在我的本地计算机上运行良好,但如果我尝试这样做:twemoji.parse('\u1f600') 我得到一个奇怪的结果:ὠ0
我的目标是在我的 Angular 应用程序中用 Jest 运行单元测试,而不需要: error TS2304: Cannot find name 'twemoji' Twemoji添加到项目 pack
在用户生成的帖子中,我有很多原始表情符号,例如 I ❤ your post! 我想知道将这些表情符号替换为彩色表情符号的最佳方式是什么,例如: I ❤️ your post! 我想用 twem
我想用 Twitter 开源 twemoji 替换 UILable 或 UITextView 中的所有标准 iOS 表情符号. 我找不到任何库或文档可以在 iOS 中执行此操作。有没有人有一个解决方案
我是一名优秀的程序员,十分优秀!