从变量打印unicode字符(swift)

时间:2015-07-29 09:15:08

标签: xcode swift unicode

我遇到了一个无法找到解决方案的问题。 我有一个字符串变量,持有unicode“1f44d”,我想将其转换为unicode字符。

通常人们会这样做:

TriggerEmail ste on ste.id = t.TriggerEmailId

这就是我的意思:

println("\u{1f44d}") // 

我已经尝试了其他几种方法,但不知何故,这种魔法背后的运作对我来说是隐藏的。

可以想象charAsString来自API调用或来自其他对象的值。

7 个答案:

答案 0 :(得分:9)

一种可能的解决方案(解释"内联"):

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")
}

使用 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")
}

另请注意,并非所有代码点都是有效的Unicode标量, 比较Validate Unicode code point in Swift

更新 Swift 3:

public init?(_ v: UInt32)

现在是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")
}

答案 1 :(得分:8)

这可以分两步完成:

  1. charAsString转换为Int代码
  2. 将代码转换为unicode字符
  3. 第二步可以完成,例如像这样

    var code = 0x1f44d
    var scalar = UnicodeScalar(code)
    var string = "\(scalar)"
    

    首先,请参阅here如何将十六进制表示中的String转换为Int

答案 2 :(得分:5)

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

答案 3 :(得分:0)

您可以使用

let char = "-12"
print(char.unicodeScalars.map {$0.value }))

您将获得以下值:

[45, 49, 50]

答案 4 :(得分:0)

在尝试使用字符串内插时,不能在Swift中使用它。因此,以下代码将无法编译:

let charAsString = "1f44d"
print("\u{\(charAsString)}")

您将必须将字符串变量转换为整数(使用init(_:radix:)初始化程序),然后从该整数创建Unicode标量。下面的Swift 5 Playground示例代码显示了如何进行:

let validCodeString = "1f44d"
let validUnicodeScalarValue = Int(validCodeString, radix: 16)!
let validUnicodeScalar = Unicode.Scalar(validUnicodeScalarValue)!
print(validUnicodeScalar) // 

答案 5 :(得分:0)

以下是几种方法:

let string = "1f44d"

解决方案1:

"&#x\(string);".applyingTransform(.toXMLHex, reverse: true)

解决方案2:

"U+\(string)".applyingTransform(StringTransform("Hex/Unicode"), reverse: true)

答案 6 :(得分:0)

我制作的这个扩展效果很好:

extension String {
    var unicode: String? {
        if let charCode = UInt32(self, radix: 16),
           let unicode = UnicodeScalar(charCode) {
            let str = String(unicode)
            return str
        }
        return nil
    }
}

如何测试:

if let test = "e9c8".unicode {
    print(test)
}

//打印:enter image description here