Как получить Unicode код точки (ы) представление символа / строки в Swift?

Как общее решение, как мы можем получить кодовые точки Unicode для символа или строки в Swift?

Учтите следующее:

let A: Character = "A"     // "\u{0041}"
let Á: Character = "Á"     // "\u{0041}\u{0301}"

let sparklingHeart = ""  // "\u{1F496}"
let SWIFT = "SWIFT"        // "\u{0053}\u{0057}\u{0049}\u{0046}\u{0054}"

Если я не ошибаюсь, желаемая функция может вернуть массив строк, например:

extension Character {
    func getUnicodeCodePoints() -> [String] {
        //...
    }
}

A.getUnicodeCodePoints()
// the output should be: ["\u{0041}"]

Á.getUnicodeCodePoints()
// the output should be: ["\u{0041}", "\u{0301}"]

sparklingHeart.getUnicodeCodePoints()
// the output should be: ["\u{1F496}"]

SWIFT.getUnicodeCodePoints()
// the output should be: ["\u{0053}", "\u{0057}", "\u{0049}", "\u{0046}", "\u{0054}"]

Любой более предложенный элегантный подход был бы оценен.

1 ответ

Решение

Как правило, unicodeScalars свойство String возвращает коллекцию скалярных значений Юникода. ( Скалярное значение Unicode - это любая кодовая точка Unicode, за исключением кодовых точек с высокой и низкой степенью суррогата.)

Пример:

print(Array("Á".unicodeScalars))  // ["A", "\u{0301}"]
print(Array("".unicodeScalars)) // ["\u{0001F496}"]

До Swift 3 нет доступа к скалярным значениям юникода Character непосредственно, он должен быть преобразован в String первый (статус Swift 4 см. ниже).

Если вы хотите видеть все скалярные значения Unicode как шестнадцатеричные числа, вы можете получить доступ к value собственность (которая является UInt32 номер) и отформатируйте его в соответствии с вашими потребностями.

Пример (с использованием U+NNNN обозначения для значений Unicode):

extension String {
    func getUnicodeCodePoints() -> [String] {
        return unicodeScalars.map { "U+" + String($0.value, radix: 16, uppercase: true) }
    }
}

extension Character {
    func getUnicodeCodePoints() -> [String] {
        return String(self).getUnicodeCodePoints()
    }
}


print("A".getUnicodeCodePoints())     // ["U+41"]
print("Á".getUnicodeCodePoints())     // ["U+41", "U+301"]
print("".getUnicodeCodePoints())    // ["U+1F496"]
print("SWIFT".getUnicodeCodePoints()) // ["U+53", "U+57", "U+49", "U+46", "U+54"]
print("".getUnicodeCodePoints())    // ["U+1F1EF", "U+1F1F4"]

Обновление для Swift 4:

Начиная с Swift 4, unicodeScalars из Character можно получить доступ напрямую, см. SE-0178 Добавление свойства unicodeScalars в Character. Это делает преобразование в String устарели:

let c: Character = ""
print(Array(c.unicodeScalars)) // ["\u{0001F1EF}", "\u{0001F1F4}"]
Другие вопросы по тегам