从变量打印unicode字符(swift)

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)


Jak*_*ano 8

这可以分两步完成:

  1. 转换charAsStringInt代码
  2. 将代码转换为unicode字符

第二步可以像这样完成

var code = 0x1f44d
var scalar = UnicodeScalar(code)
var string = "\(scalar)"
Run Code Online (Sandbox Code Playgroud)

至于第一步,请参见此处如何将String十六进制表示转换为Int


Fan*_*ude 6

从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)