Я хочу написать строку Unicode, используя шестнадцатеричные значения в Swift. Я прочитал documentation для String и Character, поэтому я знаю, что я могу использовать специальные символы Unicode непосредственно в строках, например:
var variableString = "Cat‼🐱" // "Cat" + Double Exclamation + cat emoji
Но я хотел бы сделать это, используя коды кода Unicode. Документы (и этот вопрос) показывают его для символов, но не очень ясно, как это сделать для строк.
(Примечание: хотя ответ кажется мне очевидным сейчас, это было совсем не очевидно совсем недавно. Я отвечаю на свой собственный вопрос ниже, как способ узнать, как это сделать, а также помочь себе понять Юникодная терминология и то, как работают Swift Characters and Strings.)
Ответ 1
Обновлен для Swift 3
Символ
Синтаксис Swift для формирования шестнадцатеричного кодовой точки -
\u{n}
где n - шестнадцатеричное число до 8 цифр. Допустимым диапазоном для Unicode scalar является U + 0 до U + D7FF и U + E000 до U + 10FFFF включительно. (Диапазон U + D800 до U + DFFF для суррогатных пар, которые не являются самими скалярами, но используются в UTF-16 для кодирования скаляров с более высоким значением.)
<сильные > Примеры:
// The following forms are equivalent. They all produce "C".
let char1: Character = "\u{43}"
let char2: Character = "\u{0043}"
let char3: Character = "\u{00000043}"
// Higher value Unicode scalars are done similarly
let char4: Character = "\u{203C}" // ‼ (DOUBLE EXCLAMATION MARK character)
let char5: Character = "\u{1F431}" // 🐱 (cat emoji)
// Characters can be made up of multiple scalars
let char7: Character = "\u{65}\u{301}" // é = "e" + accent mark
let char8: Character = "\u{65}\u{301}\u{20DD}" // é⃝ = "e" + accent mark + circle
Примечания:
Строка
Строки состоят из символов. Для некоторых способов формирования их с помощью шестнадцатеричных кодовых точек см. Следующие примеры.
<сильные > Примеры:
var string1 = "\u{0043}\u{0061}\u{0074}\u{203C}\u{1F431}" // Cat‼🐱
// pass an array of characters to a String initializer
let catCharacters: [Character] = ["\u{0043}", "\u{0061}", "\u{0074}", "\u{203C}", "\u{1F431}"] // ["C", "a", "t", "‼", "🐱"]
let string2 = String(catCharacters) // Cat‼🐱
Преобразование шестнадцатеричных значений во время выполнения
Во время выполнения вы можете преобразовать шестнадцатеричные или Int
значения в Character
или String
, сначала преобразуя его в UnicodeScalar
.
<сильные > Примеры:
// hex values
let value0: UInt8 = 0x43 // 97
let value1: UInt16 = 0x203C // 22823
let value2: UInt32 = 0x1F431 // 127822
// convert hex to UnicodeScalar
let scalar0 = UnicodeScalar(value0)
// make sure that UInt16 and UInt32 form valid Unicode values
guard
let scalar1 = UnicodeScalar(value1),
let scalar2 = UnicodeScalar(value2) else {
return
}
// convert to Character
let character0 = Character(scalar0) // C
let character1 = Character(scalar1) // ‼
let character2 = Character(scalar2) // 🐱
// convert to String
let string0 = String(scalar0) // C
let string1 = String(scalar1) // ‼
let string2 = String(scalar2) // 🐱
// convert hex array to String
let myHexArray = [0x43, 0x61, 0x74, 0x203C, 0x1F431] // an Int array
var myString = ""
for hexValue in myHexArray {
if let scalar = UnicodeScalar(hexValue) {
myString.append(Character(scalar))
}
}
print(myString) // Cat‼🐱
Дальнейшее чтение
Ответ 2
с вашего Hex "0x1F52D" до фактического Emoji
let c = 0x1F602
Следующий шаг, возможно, получит Uint32 с вашего Hex
let intEmoji = UnicodeScalar(c!).value
из этого вы можете сделать что-то вроде
titleLabel.text = String(UnicodeScalar(intEmoji)!)
здесь у вас есть "😂"
он работает с диапазоном шестнадцатеричных тоже
let emojiRanges = [
0x1F600...0x1F636,
0x1F645...0x1F64F,
0x1F910...0x1F91F,
0x1F30D...0x1F52D
]
for range in emojiRanges {
for i in range {
let c = UnicodeScalar(i)!.value
data.append(c)
}
}
чтобы получить несколько UInt32 из вашего диапазона Hex для примера