Как я могу правильно получить подстроку из строки Swift, которая содержит emojis?

Я не понимаю, что здесь происходит:

let strA = "0123456789"
let fromA = String.Index(encodedOffset: 2)
let toA = String.Index(encodedOffset: 8)
print("(String(strA[fromA..<toA]))") // Prints "234567".

let strB = "0123??56?89"
let fromB = String.Index(encodedOffset: 2)
let toB = String.Index(encodedOffset: 8)
print("(String(strB[fromB..<toB]))") // Prints "23??".

Я ожидаю, что нижняя строка напечатает "23??56?" но печатает "23??" . Кажется, что это проблема с кодовыми точками юникода и частично измельчение части последнего символа эмулятора юникода.

Как я могу получить ожидаемую строку "23??56?" используя смещения видимых символов?

Моя проблема связана с API-интерфейсом Twitter и расширенными твитами JSON-объектов, которые требуют, чтобы вы сокращали текст твита до размера с использованием значений display_text_range . В настоящий момент мой код сбрасывается всякий раз, когда в твитте есть эмуид, так как мой код подстроки, как и выше, искажает строку.

Всего 2 ответа


Я думаю, проблема с отображением UTF16 , потому что Emoji (?) считается одиночным символом в Swift, но как два кодовых блока UTF-16.

просто используйте

strB.utf16.count вместо strB.count

    let strB = "Yoda gives the best cuddles ??????"

// Prints "String count 29".
print("string count (strB.count)")
let fromB = String.Index(encodedOffset: 0)
let toB = String.Index(encodedOffset: strB.utf16.count)

let subString = String(strB[fromB..<toB])
print(subString)

введите описание изображения здесь


Следующее делает то, что я хочу, и печатает "23??56?" .

let strB = "0123??56?89"
print("String count (strB.count).")
let fromB = strB.index(strB.startIndex, offsetBy: 2)
let toB = strB.index(strB.startIndex, offsetBy: 8)
print("(String(strB[fromB..<toB]))")

Примечание: вместо использования:

let fromB = String.Index(encodedOffset: 2)
let toB = String.Index(encodedOffset: 8)

Я использую:

let fromB = strB.index(strB.startIndex, offsetBy: 2)
let toB = strB.index(strB.startIndex, offsetBy: 8)

Есть идеи?

10000