如何使用Unicode十六进制值(UTF-16)在Swift中表达字符串

Sur*_*gch 16 string unicode character ios swift

我想在Swift中使用十六进制值编写Unicode字符串.我已经阅读了String和Character 的文档,所以我知道我可以直接在字符串中使用特殊的Unicode字符,如下所示:

var variableString = "Cat?" // "Cat" + Double Exclamation + cat emoji
Run Code Online (Sandbox Code Playgroud)

但我想使用Unicode代码点来做到这一点.文档(和这个问题)显示了字符,但不清楚如何为字符串做.

(注意:虽然答案现在对我来说显而易见,但在不久之前它并不明显.我在回答下面的问题,作为学习如何做到这一点的一种方法,也是为了帮助自己理解Unicode术语和Swift Characters和Strings如何工作.)

Sur*_*gch 28

针对Swift 3进行了更新

字符

用于形成十六进制代码点的Swift语法是

\u{n}
Run Code Online (Sandbox Code Playgroud)

其中n是一个长达8位的十六进制数.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
Run Code Online (Sandbox Code Playgroud)

笔记:

字符串由字符组成.有关使用十六进制代码点形成它们的一些方法,请参阅以下示例.

例子:

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?
Run Code Online (Sandbox Code Playgroud)

在运行时转换十六进制值

在运行时,您可以将十六进制或Int值转换为a CharacterString首先将其转换为a 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?
Run Code Online (Sandbox Code Playgroud)

进一步阅读