作为一般解决方案,我们如何在Swift中获取字符或字符串的unicode代码点?
请考虑以下事项:
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}"
如果我没有误会,所需的函数可能会返回一个字符串数组,例如:
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}"]
任何建议的优雅方法都将受到赞赏。
答案 0 :(得分:2)
通常,unicodeScalars
的{{1}}属性会返回一个集合
它的unicode标量值。 (A Unicode scalar value是任意的
除高代理和低代理代码点之外的Unicode代码点。)
示例:
String
直到Swift 3无法访问
一个print(Array("Á".unicodeScalars)) // ["A", "\u{0301}"]
print(Array("".unicodeScalars)) // ["\u{0001F496}"]
的unicode标量值直接,它必须是
首先转换为Character
(对于Swift 4状态,请参见下文)。
如果要将所有Unicode标量值视为十六进制数
然后你可以访问String
属性(value
个号码)
并根据您的需要进行格式化。
示例(对Unicode值使用UInt32
表示法):
U+NNNN
Swift 4的更新:
从Swift 4开始,extension String {
func getUnicodeCodePoints() -> [String] {
return unicodeScalars.map { "U+" + String($0.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"]
的{{1}}就可以了
直接访问,
见SE-0178 Add unicodeScalars property to Character。这样就可以转换为unicodeScalars
过时的:
Character