如何在Swift中将代理项​​对转换为Unicode标量

Sur*_*gch 7 unicode scalar surrogate-pairs ios swift

以下示例取自字符串和字符文档:

在此输入图像描述

55357(U+D83D十六进制)和56374(U+DC36十六进制)是形成Unicode标量的代理对U+1F436,即DOG FACE字符.有没有办法走向另一个方向?也就是说,我可以将代理对转换为标量吗?

我试过了

let myChar: Character = "\u{D83D}\u{DC36}"
Run Code Online (Sandbox Code Playgroud)

但是我收到了"无效的Unicode标量"错误.

这个Objective C答案这个项目似乎是自定义解决方案,但Swift(尤其是Swift 2.0+)中是否有任何内容可以做到这一点?

Mat*_*ens 5

有一些公式可以基于代理对来计算原始代码点,反之亦然。来自https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae

Unicode标准3.0的3.7节定义了代理对之间的转换算法。

根据以下公式,C大于的代码点0xFFFF对应于代理对 <H, L>

H = Math.floor((C - 0x10000) / 0x400) + 0xD800
L = (C - 0x10000) % 0x400 + 0xDC00
Run Code Online (Sandbox Code Playgroud)

反向映射(即从代理对<H, L>到Unicode代码点C)由以下方式给出:

C = (H - 0xD800) * 0x400 + L - 0xDC00 + 0x10000
Run Code Online (Sandbox Code Playgroud)


Air*_*ity 3

给定一个 UTF-16 代码单元序列(即 16 位数字,例如从String.utf16数字数组中获取的数字),您可以使用该UTF16类型及其decode方法将其转换为UnicodeScalars,然后将其转换为String.

\n\n

它\xe2\x80\x99 是一个有点蹩脚的项目,它需要一个生成器(因为它进行有状态处理)并返回一个指示结果(具有相关标量类型)的枚举,或者一个错误或完成。Swift 2.0 模式匹配使它更容易使用:

\n\n
let u16data: [UInt16] = [0xD83D,0xDC36]\n//or let u16data = "Hello, ".utf16\n\nvar g = u16data.generate()\nvar s: String = ""\nvar utf16 = UTF16()\nwhile case let .Result(scalar) = utf16.decode(&g) {\n    print(scalar, &s)\n}\nprint(s) // prints \n
Run Code Online (Sandbox Code Playgroud)\n