如何获取含Emoji的字符串对应UTF8编码的NSRange?
如何获取包含Emoji的字符串对应UTF8编码的NSRange?
你的代码当前得到的是基于UTF-16编码单元的NSRange,而非UTF8字节范围——这是因为NSRange默认以UTF-16编码单元为基准,Swift的Range<String.Index>转NSRange时也遵循这个规则。要获取UTF8字节对应的NSRange,可以通过跟踪UTF8字节偏移量的方式实现:
解决方案代码
let str = "🎁🇵🇷" var currentUTF8Offset = 0 for char in str { let charUTF8Count = String(char).utf8.count let utf8NSRange = NSRange(location: currentUTF8Offset, length: charUTF8Count) print("utf8 Count:", charUTF8Count, "utf16 Count:", String(char).utf16.count, "utf8 NSRange:", utf8NSRange) currentUTF8Offset += charUTF8Count }
运行结果
utf8 Count: 4 utf16 Count: 2 utf8 NSRange: {0, 4} utf8 Count: 8 utf16 Count: 4 utf8 NSRange: {4, 8}
原理说明
- 维护
currentUTF8Offset变量,记录当前字符在整个字符串UTF8字节流中的起始位置 - 遍历每个字符时,先获取该字符的UTF8字节长度
- 用当前偏移量和字符UTF8长度构建目标
NSRange,之后更新偏移量为当前偏移量加上字符UTF8长度
内容的提问来源于stack exchange,提问作者Hassan Taleb
相关产品推荐
相关产品推荐

