跳到主要内容

1 篇博文 含有标签「代码点」

查看所有标签

Kotlin 2.5 Unicode 代码点 API 实战:用 CodePoint 告别代理对(Surrogate Pair)的噩梦

· 阅读需 6 分钟
重庆 Kotlin User Group

你遇到过这种场景吗?统计一个 emoji 字符串的"字符数",结果数字对不上;或者遍历一个包含罕见汉字的文本,发现一个字被拆成了两个 Char。

来看一段"经典翻车"代码:

val text = "Hello 🌍"
println(text.length) // 7?还是 8?
println(text[6]) // 期望拿到 🌍,实际是一个代理对的高位
println(text[7]) // 这才是代理对的低位

Char 在 Kotlin 中表示一个 UTF-16 编码单元,而像 🌍(U+1F30D)这样的字符超出了 BMP(基本多文种平面),需要两个 Char(即代理对)来表示。直接按 Char 遍历或统计,就会把一个字符拆成两半。