无效的狗脸标量

时间:2019-01-23 09:55:27

标签: swift string unicode

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

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

UTF-16代码为5535756374。以十六进制表示的是d83ddc36

现在:

let dog = "\u{d83d}\u{dc36}"

我没有得到带“”的字符串,而是出现了错误:

  

无效的Unicode标量

我尝试使用UTF-8代码,但也没有用。不是抛出错误,而是返回“ð¶”而不是狗的脸。

这是怎么了?

1 个答案:

答案 0 :(得分:6)

\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) //