android - 使用 iOS 键盘输入时表情符号不显示在 NSAttributedString 中,在 Android 上输入时显示

标签 android ios nsattributedstring utf-16 emoji

我正在制作一个消息应用程序,当我从 Android 端发送表情符号时,它在 iOS 端显示正常,但 iOS 端无法(似乎)显示来自 iOS 自己的键盘的表情符号!

我在其中显示表情符号的标签使用属性文本,文本来自 HTML。以下代码用于生成 NSAttributedString

var msg = getTextForDisplay()//Essentially gets the plain text
msg = "<span style=\"font-family: Helvetica; font-size:14pt;\">" + msg + "</span>"
if let data = msg.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false){
    let attributed = try? NSAttributedString(data: data, options: [ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType ], documentAttributes: nil)
    return attributed
}

更奇怪的是,当我从 iOS 发送表情符号时,虽然它没有如上所述显示在标签中,但它在 Android 端显示得非常好。在 iOS 端,在标签中,它显示了一些乱码(也许是 unicode 字符?)

例如:enter image description here

我绝对确定错误与表情符号的显示有关,因为当打印到控制台时,我看到了真实的表情符号,而且当保存到设备存储中并稍后在 Mac 上读取时,它是真实的表情符号。但是当表情符号加载到属性标签中时,它显示乱码

感谢任何帮助。我知道这个问题与编码有关我只是不确定问题到底是什么以及如何解决它

最佳答案

我们在评论中验证了源字符串没问题。只需更改一个参数! Swift 通常对字符串使用 UTF-16。您正在丢失将其作为 UTF-8 处理的信息。

改变:

msg.dataUsingEncoding(NSUTF8StringEncoding

收件人:

msg.dataUsingEncoding(NSUTF16字符串编码

对于 swift 5: 使用此 msg.data(using: String.Encoding.utf16, allowLossyConversion: false)

关于android - 使用 iOS 键盘输入时表情符号不显示在 NSAttributedString 中,在 Android 上输入时显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32979608/

相关文章:

java - 抽屉导航右间隙

Android Realm.io - 删除子对象

ios - 什么是 WebKitErrorDomain 错误代码 204?

ios - 如何在iOS崩溃报告中找到苹果团队测试过的硬件型号

ios - 绘制 PDF 时的 CFAttributedString

html - 检查 NSString 是否是 html 字符串?

Android 进度对话框从类文件中设置消息

android - 从另一个类更新列表适配器

ios - 如何在swiftui中使用内部选择器中的切换以及如何基于切换来更改选择器值

objective-c - NSParagraphStyle 行间距被忽略