正如您已经给出了转换器工具的链接,该工具显然在进行UTF-8 编码和解码。您有UTF-8 编码字符串,所以这里是UTF8-Decoding 的示例。
Objective-C
const char *ch = [@"Hii \xF0\x9F\x98\x81" cStringUsingEncoding:NSUTF8StringEncoding];
NSString *decode_string = [NSString stringWithUTF8String:ch];
NSLog(@"%@",decode_string);
输出: Hii ?
斯威夫特
我可以在SWift 中将\\xF0\\x9F\\x98\\x81 转换为?。
首先,我将十六进制字符串转换为Data,然后使用UTF-8 编码转换回String。
var str = "\\xF0\\x9F\\x98\\x81"
if let data = data(fromHexaStr: str) {
print(String(data: data, encoding: String.Encoding.utf8) ?? "")
}
输出: ?
下面是我用来将六进制字符串转换为数据的函数。我关注了this answer。
func data(fromHexaStr hexaStr: String) -> Data? {
var data = Data(capacity: hexaStr.characters.count / 2)
let regex = try! NSRegularExpression(pattern: "[0-9a-f]{1,2}", options: .caseInsensitive)
regex.enumerateMatches(in: hexaStr, range: NSMakeRange(0, hexaStr.utf16.count)) { match, flags, stop in
let byteString = (hexaStr as NSString).substring(with: match!.range)
var num = UInt8(byteString, radix: 16)!
data.append(&num, count: 1)
}
guard data.count > 0 else { return nil }
return data
}
注意: 上面代码的问题是它只转换了十六进制字符串而不是组合字符串。
最终工作解决方案:SWIFT
我已经通过使用 for 循环而不是 [0-9a-f]{1,2} 正则表达式来做到这一点,因为这也会扫描 81, 9F, Any Two digits number,这显然是错误的。
例如:I have 81 INR \\xF0\\x9F\\x98\\x81。
/// This line will convert "F0" into hexa bytes
let byte = UInt8("F0", radix: 16)
我做了一个字符串扩展,我最多检查每 4 个字符是否有前缀 \x 和计数 4,最后两个字符可以通过使用 radix 转换为十六进制字节,如上所述。
extension String {
func hexaDecoededString() -> String {
var newData = Data()
var emojiStr: String = ""
for char in self.characters {
let str = String(char)
if str == "\\" || str.lowercased() == "x" {
emojiStr.append(str)
}
else if emojiStr.hasPrefix("\\x") || emojiStr.hasPrefix("\\X") {
emojiStr.append(str)
if emojiStr.count == 4 {
/// It can be a hexa value
let value = emojiStr.replacingOccurrences(of: "\\x", with: "")
if let byte = UInt8(value, radix: 16) {
newData.append(byte)
}
else {
newData.append(emojiStr.data(using: .utf8)!)
}
/// Reset emojiStr
emojiStr = ""
}
}
else {
/// Append the data as it is
newData.append(str.data(using: .utf8)!)
}
}
let decodedString = String(data: newData, encoding: String.Encoding.utf8)
return decodedString ?? ""
}
}
用法:
var hexaStr = "Hi \\xF0\\x9F\\x98\\x81 81"
print(hexaStr.hexaDecoededString())
嗨? 81
hexaStr = "Welcome to SP19!\\xF0\\x9f\\x98\\x81"
print(hexaStr.hexaDecoededString())
欢迎来到 SP19!?