无效的狗脸标量

Rob*_*bok 3 string unicode swift

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

for code in "".utf16 {
    print(code)
}
Run Code Online (Sandbox Code Playgroud)

UTF-16代码是5535756374.在十六进制中,那是d83ddc36.

现在:

let dog = "\u{d83d}\u{dc36}"
Run Code Online (Sandbox Code Playgroud)

我没有收到带""的字符串,而是收到错误:

无效的unicode标量

我尝试使用UTF-8代码,但它也没有用.不抛出错误,但返回"ð"而不是狗脸.

这有什么不对?

Mar*_*n R 6

\u{nnnn}转义序列需要一个Unicode标值,而不是UTF-16表示(具有高和低的替代物):

for code in "".unicodeScalars {
    print(String(code.value, radix: 16))
}
// 1f436

let dog = "\u{1F436}"
print(dog) // 
Run Code Online (Sandbox Code Playgroud)

从UTF-16表示重建字符串的解决方案可以找到有没有办法在swift中从utf16数组创建一个字符串?.例如:

let utf16: [UInt16] = [ 0xd83d, 0xdc36 ]
let dog = String(utf16CodeUnits: utf16, count: utf16.count)
print(dog) // 
Run Code Online (Sandbox Code Playgroud)