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

Emoji doesn't show in NSAttributedString when typed using iOS keyboard, does when typed on Android

我正在制作一个消息应用程序,当我从 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 字符?)

例如:

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

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

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

变化:

msg.dataUsingEncoding(NSUTF8StringEncoding

收件人:

msg.dataUsingEncoding(NSUTF16StringEncoding