yes*_*n82 11 unicode xcode swift
我有一个问题,我找不到解决方案.我有一个字符串变量持有unicode"1f44d",我想将其转换为unicode字符.
通常会做这样的事情:
println("\u{1f44d}") //
Run Code Online (Sandbox Code Playgroud)
这就是我的意思:
let charAsString = "1f44d" // code in variable
println("\u{\(charAsString)}") // not working
Run Code Online (Sandbox Code Playgroud)
我已经尝试了其他几种方法,但不知何故,这种魔法背后的运作对我来说是隐藏的.
可以想象charAsString来自API调用或来自其他对象的值.
Mar*_*n R 10
一种可能的解决方案(解释"内联"):
let charAsString = "1f44d"
// Convert hex string to numeric value first:
var charCode : UInt32 = 0
let scanner = NSScanner(string: charAsString)
if scanner.scanHexInt(&charCode) {
// Create string from Unicode code point:
let str = String(UnicodeScalar(charCode))
println(str) //
} else {
println("invalid input")
}
Run Code Online (Sandbox Code Playgroud)
使用Swift 2稍微简单一点:
let charAsString = "1f44d"
// Convert hex string to numeric value first:
if let charCode = UInt32(charAsString, radix: 16) {
// Create string from Unicode code point:
let str = String(UnicodeScalar(charCode))
print(str) //
} else {
print("invalid input")
}
Run Code Online (Sandbox Code Playgroud)
另请注意,并非所有代码点都是有效的Unicode标量,请在Swift中比较验证Unicode代码点.
Swift 3更新:
public init?(_ v: UInt32)
Run Code Online (Sandbox Code Playgroud)
现在是一个可用的初始化器,UnicodeScalar并检查给定的数字输入是否是有效的Unicode标量值:
let charAsString = "1f44d"
// Convert hex string to numeric value first:
if let charCode = UInt32(charAsString, radix: 16),
let unicode = UnicodeScalar(charCode) {
// Create string from Unicode code point:
let str = String(unicode)
print(str) //
} else {
print("invalid input")
}
Run Code Online (Sandbox Code Playgroud)
这可以分两步完成:
charAsString为Int代码第二步可以像这样完成
var code = 0x1f44d
var scalar = UnicodeScalar(code)
var string = "\(scalar)"
Run Code Online (Sandbox Code Playgroud)
至于第一步,请参见此处如何将String十六进制表示转换为Int
从Swift 2.0开始,每种Int类型都有一个初始化程序,可以String作为输入.然后,您可以轻松生成UnicodeScalar相应的内容,然后将其打印出来.无需将字符表示更改为字符串;).
更新:Swift 3.0更改了UnicodeScalar初始化程序
print("\u{1f44d}") //
let charAsString = "1f44d" // code in variable
let charAsInt = Int(charAsString, radix: 16)! // As indicated by @MartinR radix is required, default won't do it
let uScalar = UnicodeScalar(charAsInt)! // In Swift 3.0 this initializer is failible so you'll need either force unwrap or optionnal unwrapping
print("\(uScalar)")
Run Code Online (Sandbox Code Playgroud)