You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取含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}

原理说明

  1. 维护currentUTF8Offset变量,记录当前字符在整个字符串UTF8字节流中的起始位置
  2. 遍历每个字符时,先获取该字符的UTF8字节长度
  3. 用当前偏移量和字符UTF8长度构建目标NSRange,之后更新偏移量为当前偏移量加上字符UTF8长度

内容的提问来源于stack exchange,提问作者Hassan Taleb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 20:39:19