我以为我很了解 Swift 中的 Unicode 标量,但是狗脸表情符号证明我错了。

for code in "🐶".utf16 {
    print(code)
}

UTF-16 代码是 5535756374 。在十六进制中,这是 d83ddc36

现在:

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/

10-14 18:37