У меня есть приложения в Go и Swift, которые обрабатывают строки, такие как поиск подстрок и их индексов. Сначала он работал хорошо даже с многобайтовыми символами (например, emojis), используя Go * utf8.RuneCountInString()
и родную строку Swift.
Но есть некоторые символы UTF8, которые разбивают длину строки и индексы для подстрок, например, строка "Lorem ??✌️? ipsum"
:
Go's utf8.RuneCountInString("Lorem ??✌️? ipsum")
возвращает 17, а начальный индекс ipsum
равен 12.
Свифт "Lorem ??✌️? ipsum".count
возвращает 16, а начальный индекс ipsum
равен 11.
Использование Swift String utf8
, utf16
или приведение к NSString
дает также различные длины и индексы. Есть и другие смайлики, составленные из множества других смайликов типа ????, которые дают еще более смешные цифры.
Это с Go 1.8 и Swift 4.1.
Есть ли способ получить одинаковые длины строк и индексы подстрок с одинаковыми значениями с помощью Go и Swift?
EDIT
Я создал расширение Swift String на основе замечательного ответа @ MartinR:
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)
}
}