Основы Swift / 6.8. Строки и символы 5 - Unicode-представление строк


Видео


"Ничто и никогда не длится вечно, но жизнь от этого не становится менее прекрасной."
Этот раздел также посвящён Юникод и если у Вас нет необходимости в работе с ним, то временно Вы можете оставить этот раздел.
Юникод-представление строк
Когда Юникод-строка записываемся в текстовый файл или любое другое хранилище, Юникод-скаляры в этой строке котируются в одну из нескольких Юникод-определяемых кодировок. Каждая кодировка кодирует строку в малые блоки, известные как код-юниты. Сюда входят следующие кодировки: UTF-8 (которая кодирует строку в 8-битные код-юниты), UTF-16 (которая кодирует строку в 16-битные код-юниты) и UTF-32 (которая кодирует строку в 32-битные код-юниты).

Swift предоставляет несколько различных способов получить доступ к Юникод-представлениям строк. Вы можете проитерироваться через строку с помощью инструкции for-in для доступа к отдельным значениям типа Character в качестве расширенных графем-кластеров.

Помимо этого доступ к значению String в одном из трёх других Unicode-совместимых отображений:
  • Коллекция код-юнитов UTF-8 (к ним можно получить доступ с помощью свойства строки utf8)
  • Коллекция код-юнитов UTF-16 (к ним можно получить доступ с помощью свойства строки utf16)
  • Коллекция 21-битных Юникод-скаляров, эквивалентная кодировке UTF-32 (к ним можно получить доступ с помощью свойства строки unicodeScalars)
@{6.8\1\1}
let dogString = "Пёс‼🐶"
Каждый пример демонстрирует разное отображение следующей строки, которая состоит из символов 'D', 'o', 'g', '!!' ("DOUBLE EXCLAMATION MARK", "U+203C") и , 🐶 ("DOG FACE", "U+1F436") или скаляра Юникода U+203C) , и 🐶 символа (DOG FACE , или скаляру Юникода  U+1F436 ).
UTF8: @{6.8\1\2}
Вы можете получить доступ к представлению String кодировки UTF-8 с помощью итерации через свойство utf8. Это свойство имеет тип String.UTF8View, который является коллекцией беззнаковых восьмибитных значений (UInt8), по одному для каждого байта в строковом UTF-8 представлении:
for codeUnit in dogString.utf8 {
    print("\(codeUnit) ", terminator: " ")
}
print("")
UTF16: @{6.8\1\3}
Вы можете получить доступ к представлению String кодировки UTF-16 с помощью итерации через свойство utf16. Это свойство имеет тип String.UTF16View, который является коллекцией беззнаковых 16-битных значений (UInt16), по одному для каждого 16-битного кода в строковом UTF-16 представлении:
for codeUnit in dogString.utf16 {
    print("\(codeUnit) ", terminator: " ")
}
print("")
Юникод-скалярное представление: @{6.8\1\4}, @{6.8\1\5}
Вы можете получить доступ к Юникод-скалярному представлению значения типа String с помощью итерации через свойство unicodeSclars. Это свойство имеет тип UnicodeScalarView, который является коллекцией значений типа UnicodeScalar.

Каждый UnicodeScalar имеет свойство value, которое возвращает 21-битное скальное значение, представляемое в качестве значения типа UInt32:
for scalar in dogString.unicodeScalars {
    print("\(scalar.value) ", terminator: " ")
}
print("")
В качестве альтернативы для запроса их свойств value каждое значение типа UnicodeScalar может быть использовано для создания нового значения типа String, как и в строковой интерполяции:
for scalar in dogString.unicodeScalars {
    print("\(scalar) ")
}