如何使用Unicodehex值(UTF-16)在Swift中表示string

我想在Swift中使用hex值编写一个Unicodestring。 我已经阅读了string和字符的文档 ,所以我知道我可以直接在string中使用特殊的Unicode字符,如下所示:

var variableString = "Cat‼🐱" // "Cat" + Double Exclamation + cat emoji 

但是我想用Unicode代码点来做。 文档(和这个问题 )显示它的字符,但不是很清楚如何做的string。

(注意:虽然现在对我来说这个答案似乎很明显,但在很短的时间内就不是很明显了,我正在回答我自己的问题,作为学习如何做的一个手段,也是为了帮助我自己理解Unicode术语和Swiftangular色和string如何工作)

更新了Swift 3

字符

用于形成hex代码点的Swift语法是

 \u{n} 

其中n是长达8位的hex数字。 Unicode 标量的有效范围是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 

笔记:

  • 可以添加或省略前导零
  • 字符被称为扩展字形集群 。 即使它们是由多个标量组成的,仍然被认为是单个字符。 关键是它们看起来像是一个字符(字形)给用户。
  • TODO: 如何将代理对转换为Swift中的Unicode标量

string由字符组成。 有关使用hex代码点进行构build的一些方法,请参阅以下示例。

例子:

 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‼🐱 

在运行时转换hex值

在运行时,可以通过首先将其转换为UnicodeScalar将hex或Int值转换为CharacterString

例子:

 // 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‼🐱 

进一步阅读

  • string和字符文档
  • Unicode术语表
  • Swift中的string
  • 在Swift中使用Unicode代码点

从你的hex“0x1F52D”到实际的表情符号

 let c = 0x1F602 

下一步可能会从你的hex得到一个Uint32

 let intEmoji = UnicodeScalar(c!).value 

从这个你可以做类似的事情

 titleLabel.text = String(UnicodeScalar(intEmoji)!) 

在这里你有一个“😂”

它也适用于hex的范围

 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) } } 

例如从你的hex范围获取多个UInt32