我以为我很了解 Swift 中的 Unicode 标量,但是狗脸表情符号证明我错了。
for code in "🐶".utf16 {
print(code)
}
UTF-16 代码是
55357
和 56374
。在十六进制中,这是 d83d
和 dc36
。现在:
let dog = "\u{d83d}\u{dc36}"
我得到的不是带有“🐶”的字符串,而是一个错误:
我尝试使用 UTF-8 代码,但它也不起作用。不是抛出错误,而是返回“ð¶”而不是狗脸。
这里有什么问题?
最佳答案
\u{nnnn}
转义序列需要 Unicode scalar value ,而不是 UTF-16 表示(具有高和低代理):
for code in "🐶".unicodeScalars {
print(String(code.value, radix: 16))
}
// 1f436
let dog = "\u{1F436}"
print(dog) // 🐶
可以在 Is there a way to create a String from utf16 array in swift? 找到从 UTF-16 表示重建字符串的解决方案。例如:
let utf16: [UInt16] = [ 0xd83d, 0xdc36 ]
let dog = String(utf16CodeUnits: utf16, count: utf16.count)
print(dog) // 🐶
关于swift - 无效的狗脸标量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54324468/