美文网首页swift 文章收集iOS Developer
iOS Swift String有emoji情况下长度不准的问题

iOS Swift String有emoji情况下长度不准的问题

作者: 盛夏凉风 | 来源:发表于2016-12-08 11:43 被阅读352次

如图,

这是一个评论列表,发评论者的名字用黑色粗体,被别人回复的名字用蓝色字体@XX显示。但当名字出现emoji的时候,就会出现颜色字体对不上的情况。

没有emoji情况下正常.jpeg 有emoji的情况颜色会错位.jpeg

代码

let SenderNickname : String = sender["nickname"] as!String//发评论人的昵称
                           
let receiverNickname : String = receiver!["nickname"] as!String//被回复人的昵称
                            
let contentStr = SenderNickname+"@"+receiverNickname+":"+content//内容
                            
let attributeStr : NSMutableAttributedString = NSMutableAttributedString.init(string: contentStr)
                            
                            attributeStr.yy_font = UIFont.systemFont(ofSize: 15)
                            
                            attributeStr.yy_lineSpacing = 5
                            
                            attributeStr.yy_alignment = NSTextAlignment.left
                            
let attributes1: [String: UIFont] = [NSFontAttributeName: UIFont.init(name: "Helvetica-Bold", size: 15)!]
                            
let attributes2: [String: UIColor] = [NSForegroundColorAttributeName: kRGBA(77, g: 135, b: 175, a: 1)]
                            
                            attributeStr.addAttributes(attributes1, range: NSRange.init(location: 0, length: SenderNickname.characters.count))//设置黑粗体
                            
                            attributeStr.addAttributes(attributes2, range: NSRange.init(location: SenderNickname.characters.count, length: receiverNickname.characters.count+1))

上述代码就是设置富文本的代码,检查一下没有问题,但为什么有emoji的话就错位了呢?之前在OC工程上面做过类似的事情,并没有出现上述问题。

我们将目标锁定在设置富文本的Rang和length这两个参数上面,将有问题的SenderNickname,和长度打印出来看看,首先用characters.count打印SenderNickname的长度

长度为4貌似没毛病.png

然而,OC工程做类似事情,没问题,所以我用NS对象试一下打印长度

NSString.length获取的长度为5.png

因为Swift的String没有length方法,所以获取字符串长度是用characters.count,然而OC的NSString用的则是.length获取长度,在有emoji的情况下,区别就出来了。

---------分析:
我们来看一下文档关于Swift的String和OC的NSString的资料

NSString的资料.png Swift的关于计算长度的资料,里面专门拿emoji出来做了一个例子.png

我的理解是:NSString是由UTF-16单元构成,.length方法返回的是基于UTF-16的长度。Swift的characters.count返回的只是Unicode字符个数,而Swift有专门的utf16.count是对应NSString的.length方法。而addAttribute里面的Rang对应的应该就是UTF-16的长度。

问题解决了,若有不正确的地方,欢迎指出

相关文章

网友评论

    本文标题:iOS Swift String有emoji情况下长度不准的问题

    本文链接:https://www.haomeiwen.com/subject/goxsmttx.html