Преобразовать массив кодовых точек Юникода в строку - PullRequest
0 голосов
/ 19 января 2019

Учитывая массив строк, которые представляют кодовые точки Unicode:

let arr : [String] = ["0023", "FE0F", "20E3"]

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

let str = "\u{0023}\u{FE0F}\u{20E3}"

Однако я хотел бы сделать это динамически, поскольку каждый массив будет представлять некоторую последовательность кодовых точек.В приведенном выше примере результат будет #️⃣

1 Ответ

0 голосов
/ 19 января 2019

Вы можете преобразовать каждую гекса-строку в UInt32, инициализировать Unicode.Scalar для каждого элемента и создать из него String UnicodeScalarView:

let arr = ["0023", "FE0F", "20E3"]
let values = arr.compactMap{ UInt32($0, radix: 16) }
let unicodeScalars = values.compactMap(Unicode.Scalar.init)
let string = String(String.UnicodeScalarView(unicodeScalars))

Который также может быть записан в виде одной строки:

let arr = ["0023", "FE0F", "20E3"]
let string = String(String.UnicodeScalarView(arr.compactMap{ UInt32($0, radix: 16) }.compactMap(Unicode.Scalar.init)))

редактирование / обновление:

Если все ваши строки могут быть представлены значениями UInt16, вы также можете использовать инициализатор строки init(utf16CodeUnits: UnsafePointer<unichar>, count: Int), как показано @MartinR здесь :

let arr = ["0023", "FE0F", "20E3"]
let values = arr.compactMap { UInt16($0, radix: 16) }
let string = String(utf16CodeUnits: values, count: values.count)  // "#️⃣"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...