如何在 Swift 中获取 character/string 的 unicode 代码点表示?
How to get unicode code point(s) representation of character/string in Swift?
作为通用解决方案,我们如何获取 Swift 中字符或字符串的 unicode 代码 point/s?
考虑以下几点:
let A: Character = "A" // "\u{0041}"
let Á: Character = "Á" // "\u{0041}\u{0301}"
let sparklingHeart = "" // "\u{1F496}"
let SWIFT = "SWIFT" // "\u{0053}\u{0057}\u{0049}\u{0046}\u{0054}"
如果我没记错的话,所需的函数可能 return 一个字符串数组,例如:
extension Character {
func getUnicodeCodePoints() -> [String] {
//...
}
}
A.getUnicodeCodePoints()
// the output should be: ["\u{0041}"]
Á.getUnicodeCodePoints()
// the output should be: ["\u{0041}", "\u{0301}"]
sparklingHeart.getUnicodeCodePoints()
// the output should be: ["\u{1F496}"]
SWIFT.getUnicodeCodePoints()
// the output should be: ["\u{0053}", "\u{0057}", "\u{0049}", "\u{0046}", "\u{0054}"]
任何更优雅的建议方法将不胜感激。
一般来说,unicodeScalars
属性一个String
returns一个集合
它的 unicode 标量值。 (A Unicode scalar value 是任何
除了高代理项和低代理项代码点之外的 Unicode 代码点。)
示例:
print(Array("Á".unicodeScalars)) // ["A", "\u{0301}"]
print(Array("".unicodeScalars)) // ["\u{0001F496}"]
最多Swift3 无法访问
直接 Character
的 unicode 标量值,它必须是
首先转换为 String
(Swift 4 状态,见下文)。
如果您想将所有 Unicode 标量值都视为十六进制数
然后你可以访问 value
属性 (这是一个 UInt32
号码)
并根据您的需要进行格式化。
示例(对 Unicode 值使用 U+NNNN
表示法):
extension String {
func getUnicodeCodePoints() -> [String] {
return unicodeScalars.map { "U+" + String([=11=].value, radix: 16, uppercase: true) }
}
}
extension Character {
func getUnicodeCodePoints() -> [String] {
return String(self).getUnicodeCodePoints()
}
}
print("A".getUnicodeCodePoints()) // ["U+41"]
print("Á".getUnicodeCodePoints()) // ["U+41", "U+301"]
print("".getUnicodeCodePoints()) // ["U+1F496"]
print("SWIFT".getUnicodeCodePoints()) // ["U+53", "U+57", "U+49", "U+46", "U+54"]
print("".getUnicodeCodePoints()) // ["U+1F1EF", "U+1F1F4"]
Swift4 的更新:
从 Swift 4 开始,Character
的 unicodeScalars
可以是
直接访问,
参见 SE-0178 Add unicodeScalars property to Character。这使得转换为 String
已过时:
let c: Character = ""
print(Array(c.unicodeScalars)) // ["\u{0001F1EF}", "\u{0001F1F4}"]
作为通用解决方案,我们如何获取 Swift 中字符或字符串的 unicode 代码 point/s?
考虑以下几点:
let A: Character = "A" // "\u{0041}"
let Á: Character = "Á" // "\u{0041}\u{0301}"
let sparklingHeart = "" // "\u{1F496}"
let SWIFT = "SWIFT" // "\u{0053}\u{0057}\u{0049}\u{0046}\u{0054}"
如果我没记错的话,所需的函数可能 return 一个字符串数组,例如:
extension Character {
func getUnicodeCodePoints() -> [String] {
//...
}
}
A.getUnicodeCodePoints()
// the output should be: ["\u{0041}"]
Á.getUnicodeCodePoints()
// the output should be: ["\u{0041}", "\u{0301}"]
sparklingHeart.getUnicodeCodePoints()
// the output should be: ["\u{1F496}"]
SWIFT.getUnicodeCodePoints()
// the output should be: ["\u{0053}", "\u{0057}", "\u{0049}", "\u{0046}", "\u{0054}"]
任何更优雅的建议方法将不胜感激。
一般来说,unicodeScalars
属性一个String
returns一个集合
它的 unicode 标量值。 (A Unicode scalar value 是任何
除了高代理项和低代理项代码点之外的 Unicode 代码点。)
示例:
print(Array("Á".unicodeScalars)) // ["A", "\u{0301}"]
print(Array("".unicodeScalars)) // ["\u{0001F496}"]
最多Swift3 无法访问
直接 Character
的 unicode 标量值,它必须是
首先转换为 String
(Swift 4 状态,见下文)。
如果您想将所有 Unicode 标量值都视为十六进制数
然后你可以访问 value
属性 (这是一个 UInt32
号码)
并根据您的需要进行格式化。
示例(对 Unicode 值使用 U+NNNN
表示法):
extension String {
func getUnicodeCodePoints() -> [String] {
return unicodeScalars.map { "U+" + String([=11=].value, radix: 16, uppercase: true) }
}
}
extension Character {
func getUnicodeCodePoints() -> [String] {
return String(self).getUnicodeCodePoints()
}
}
print("A".getUnicodeCodePoints()) // ["U+41"]
print("Á".getUnicodeCodePoints()) // ["U+41", "U+301"]
print("".getUnicodeCodePoints()) // ["U+1F496"]
print("SWIFT".getUnicodeCodePoints()) // ["U+53", "U+57", "U+49", "U+46", "U+54"]
print("".getUnicodeCodePoints()) // ["U+1F1EF", "U+1F1F4"]
Swift4 的更新:
从 Swift 4 开始,Character
的 unicodeScalars
可以是
直接访问,
参见 SE-0178 Add unicodeScalars property to Character。这使得转换为 String
已过时:
let c: Character = ""
print(Array(c.unicodeScalars)) // ["\u{0001F1EF}", "\u{0001F1F4}"]