特点
用于形成十六进制的 Swift 语法代码点 http://unicode.org/glossary/#code_point is
\u{n}
where n是长度最多为 8 位的十六进制数。 Unicode 的有效范围scalar http://unicode.org/glossary/#unicode_scalar_value是 U+0 到 U+D7FF 和 U+E000 到 U+10FFFF(含)。 (U+D800 至 U+DFFF 范围适用于代理对 http://unicode.org/glossary/#surrogate_pair,它们本身不是标量,但用于UTF-16 http://unicode.org/glossary/#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
Notes:
- 可以添加或省略前导零
- 字符被称为扩展字素簇 https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/StringsAndCharacters.html#//apple_ref/doc/uid/TP40014097-CH7-ID293。即使它们由多个标量组成,它们仍然被视为单个字符。关键是它们对用户来说似乎是单个字符(字素)。
- TODO: 如何在 Swift 中将代理对转换为 Unicode 标量 https://stackoverflow.com/questions/31282675/how-to-convert-surrogate-pair-to-unicode-scalar-in-swift
String
字符串是由字符组成的。请参阅以下示例,了解使用十六进制代码点形成它们的一些方法。
例子:
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
or String
首先将其转换为UnicodeScalar
.
例子:
// hex values
let value0: UInt8 = 0x43 // 67
let value1: UInt16 = 0x203C // 8252
let value2: UInt32 = 0x1F431 // 128049
// 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‼????
进一步阅读
- 字符串和字符文档 https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/StringsAndCharacters.html
- Unicode 术语表 http://unicode.org/glossary/
- Swift 中的字符串 http://oleb.net/blog/2014/07/swift-strings/
- 在 Swift 中使用 Unicode 代码点 https://stackoverflow.com/questions/31272561/working-with-unicode-code-points-in-swift