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

Ham*_*lik 6 android utf-16 nsattributedstring ios 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
}
Run Code Online (Sandbox Code Playgroud)

更奇怪的是,当我从iOS发送表情符号时,虽然它没有如上所述在标签中显示,但它确实在Android端显示完全正常.在iOS方面,在标签中,它显示了看似乱七八糟的东西(也许是unicode chasracters?)

例如: 在此输入图像描述

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

任何帮助表示赞赏.我理解这个问题与编码有关我只是不确定究竟是什么问题以及如何解决它

Ben*_*Ben 6

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

改变:

msg.dataUsingEncoding(NSUTF8StringEncoding)

到:

msg.dataUsingEncoding(NSUTF 16 StringEncoding)

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