Как получить 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}"]