如何将字符串 "U+XXXXXX" 中的 unicode 值转换为 Swift 中的相应字符?
How can I convert unicode values in a string "U+XXXXXX" to the corresponding characters in Swift?
我从后端接受以下 json
{
"id": "f33919f6-3554-4246-9e78-bca3a690c119",
"title": "Category3",
"slug": "category3",
"hex_up": "#eb4034",
"hex_down": "#80302a",
"emoji": "U+1F602",
"parent_id": "aa3f651b-f068-4ae1-a9d8-a18a9945b111"
}
有个字段"emoji": "U+1F602",
我需要像在 UILabel 中一样显示表情符号图标
我尝试 google 并找到类似
的结果
let scalarValue = UnicodeScalar(emojiString)
let myString = String(scalarValue!)
不幸的是,应用程序在第二行崩溃了。
感谢您的回答。
Swift 中没有 U+...
语法。 (有一个 \u{...}
语法可以做同样的事情,但这里没有必要。)
您需要自己解析字符串:
func parseUnicode(_ string: String) -> String? {
guard string.hasPrefix("U+"), // Make sure it's a U+ string
let value = Int(string.dropFirst(2), radix: 16), // Convert to Int
let scalar = UnicodeScalar(value) // Convert to UnicodeScalar
else { return nil }
return String(scalar) // Convert to String
}
if let myString = parseUnicode(emoji) { ... }
这里不要使用!
。 U+...
字符串可能无效,在这种情况下您不希望崩溃。
您的应用程序崩溃的原因是您尝试初始化的 scalarValue 是 nil
,并且您在第 2 行使用 (!
) 的 nil 值强制展开. Rob 的回答展示了如何安全地解包可选的。
您可以使用U+
后面的值获取表情符号。所以你需要删除字符串的前两个字符。所以使用这段代码来完成:
let parsedEmoji = emojiString.substring(from:2)
现在您将使用以下代码转换该表情符号 unicode。
let emoji = String(UnicodeScalar(Int(parsedEmojiHex,radix: 16)!)!)
print(emoji)
您可以简单地应用从 "Hex/Unicode"
到 "Any"
(一组所有字符)的字符串转换:
"U+1F602".applyingTransform(.init("Hex/Unicode-Any"), reverse: false) // ""
或作为 StringProtocol 的实例属性到 encode/decode from/to hexa unicode:
extension StringTransform {
static let unicodeToAny: Self = .init("Hex/Unicode-Any")
static let anyToUnicode: Self = .init("Any-Hex/Unicode")
}
extension StringProtocol {
var decodingHexaUnicode: String {
applyingTransform(.unicodeToAny, reverse: false)!
}
var encodingHexaUnicode: String {
applyingTransform(.anyToUnicode, reverse: false)!
}
}
用法:
let hexaUnicode = "U+1F602"
let emoji = hexaUnicode.decodingHexaUnicode // ""
let unicodeFromEmoji = emoji.encodingHexaUnicode // "U+1F602"
我从后端接受以下 json
{
"id": "f33919f6-3554-4246-9e78-bca3a690c119",
"title": "Category3",
"slug": "category3",
"hex_up": "#eb4034",
"hex_down": "#80302a",
"emoji": "U+1F602",
"parent_id": "aa3f651b-f068-4ae1-a9d8-a18a9945b111"
}
有个字段"emoji": "U+1F602",
我需要像在 UILabel 中一样显示表情符号图标 我尝试 google 并找到类似
的结果let scalarValue = UnicodeScalar(emojiString)
let myString = String(scalarValue!)
不幸的是,应用程序在第二行崩溃了。 感谢您的回答。
Swift 中没有 U+...
语法。 (有一个 \u{...}
语法可以做同样的事情,但这里没有必要。)
您需要自己解析字符串:
func parseUnicode(_ string: String) -> String? {
guard string.hasPrefix("U+"), // Make sure it's a U+ string
let value = Int(string.dropFirst(2), radix: 16), // Convert to Int
let scalar = UnicodeScalar(value) // Convert to UnicodeScalar
else { return nil }
return String(scalar) // Convert to String
}
if let myString = parseUnicode(emoji) { ... }
这里不要使用!
。 U+...
字符串可能无效,在这种情况下您不希望崩溃。
您的应用程序崩溃的原因是您尝试初始化的 scalarValue 是 nil
,并且您在第 2 行使用 (!
) 的 nil 值强制展开. Rob 的回答展示了如何安全地解包可选的。
您可以使用U+
后面的值获取表情符号。所以你需要删除字符串的前两个字符。所以使用这段代码来完成:
let parsedEmoji = emojiString.substring(from:2)
现在您将使用以下代码转换该表情符号 unicode。
let emoji = String(UnicodeScalar(Int(parsedEmojiHex,radix: 16)!)!)
print(emoji)
您可以简单地应用从 "Hex/Unicode"
到 "Any"
(一组所有字符)的字符串转换:
"U+1F602".applyingTransform(.init("Hex/Unicode-Any"), reverse: false) // ""
或作为 StringProtocol 的实例属性到 encode/decode from/to hexa unicode:
extension StringTransform {
static let unicodeToAny: Self = .init("Hex/Unicode-Any")
static let anyToUnicode: Self = .init("Any-Hex/Unicode")
}
extension StringProtocol {
var decodingHexaUnicode: String {
applyingTransform(.unicodeToAny, reverse: false)!
}
var encodingHexaUnicode: String {
applyingTransform(.anyToUnicode, reverse: false)!
}
}
用法:
let hexaUnicode = "U+1F602"
let emoji = hexaUnicode.decodingHexaUnicode // ""
let unicodeFromEmoji = emoji.encodingHexaUnicode // "U+1F602"