我以为我很了解Swift中的Unicode标量,但是狗脸表情符号证明我错了。
for code in "".utf16 {
print(code)
}
UTF-16代码为55357
和56374
。以十六进制表示的是d83d
和dc36
。
现在:
let dog = "\u{d83d}\u{dc36}"
我没有得到带“”的字符串,而是出现了错误:
无效的Unicode标量
我尝试使用UTF-8代码,但也没有用。不是抛出错误,而是返回“ð¶”而不是狗的脸。
这是怎么了?
答案 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) //