NSAttributedString and emojis: issue with position

2019-03-11 09:02发布

问题:

I'm coloring some parts of a text coming from an API (think "@mention" as on Twitter) using NSAttributedString.

The API gives me the text and an array of entities representing the parts of the text that are mentions (or links, tags, etc) which should be colored.

But sometimes, the coloration is offset because of emojis.


For example, with this text:

"@ericd Some text. @apero"

the API gives:

[ { "text" : "ericd", "len" : 6, "pos" : 0 }, { "text" : "apero", "len" : 6, "pos" : 18 } ]

which I successfully translate to an NSAttributedString using NSRange:

for m in entities.mentions {
    let r = NSMakeRange(m.pos, m.len)
    myAttributedString.addAttribute(NSForegroundColorAttributeName, value: someValue, range: r)
}

We see that "pos": 18 is correct, this is where "@apero" starts. The colored parts are "@ericd" and "@apero", as expected.

but when some specific combinations of emojis are used in the text, the API does not translate well to NSATtributedString, the coloration is offset:

"@ericd Some text.