我遇到了一个无法找到解决方案的问题。 我有一个字符串变量,持有unicode“1f44d”,我想将其转换为unicode字符。
通常人们会这样做:
TriggerEmail ste on ste.id = t.TriggerEmailId
这就是我的意思:
println("\u{1f44d}") //
我已经尝试了其他几种方法,但不知何故,这种魔法背后的运作对我来说是隐藏的。
可以想象charAsString来自API调用或来自其他对象的值。
答案 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)
这可以分两步完成:
charAsString
转换为Int
代码第二步可以完成,例如像这样
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)