【发布时间】:2018-10-12 16:55:53
【问题描述】:
我在 Go 和 Swift 中有处理字符串的应用程序,例如查找子字符串及其索引。起初,即使使用多字节字符(例如表情符号),它也能很好地工作,使用 Go 的 utf8.RuneCountInString() 和 Swift 的原生字符串。
但是有一些 UTF8 字符会破坏字符串长度和子字符串的索引,例如一个字符串"Lorem ????????✌️???? ipsum":
Go 的 utf8.RuneCountInString("Lorem ????????✌️???? ipsum") 返回 17,ipsum 的起始索引为 12。
Swift 的"Lorem ????????✌️???? ipsum".count 返回 16,ipsum 的起始索引是 11。
使用 Swift String 的 utf8、utf16 或强制转换为 NSString 也会给出不同的长度和索引。还有其他表情符号由多个其他表情符号组成,例如????????????????????这给出了更有趣的数字。
这适用于 Go 1.8 和 Swift 4.1。
有没有什么方法可以用 Go 和 Swift 获得相同的字符串长度和子字符串的索引?
编辑
我根据@MartinR 的出色回答创建了一个 Swift 字符串扩展:
extension String {
func runesRangeToNSRange(from: Int, to: Int) -> NSRange {
let length = to - from
let start = unicodeScalars.index(unicodeScalars.startIndex, offsetBy: from)
let end = unicodeScalars.index(start, offsetBy: length)
let range = start..<end
return NSRange(range, in: self)
}
}
【问题讨论】:
-
请注意,
NSRange仍然是另一回事:它来自NSString并计算 UTF-16 代码单元。 -
@MartinR 是的,我知道。我需要
NSRange,所以我可以将它与TTTAttributedLabel一起使用。 Apple 给了我们太多的范围和字符串,结合正则表达式使用起来很愉快:(再次感谢。