以下示例取自Strings and Characters documentation:
值55357
(十六进制为U+D83D
)和56374
(十六进制为U+DC36
)是构成Unicode标量U+1F436
的代理对,是DOG FACE
个字符。有没有办法走向另一个方向?也就是说,我可以将代理对转换为标量吗?
我试过
let myChar: Character = "\u{D83D}\u{DC36}"
但是我收到了“无效的Unicode标量”错误。
This Objective C answer和this project似乎是自定义解决方案,但Swift(特别是Swift 2.0+)中是否有内置的功能可以解决这个问题?
答案 0 :(得分:4)
有基于代理对计算原始代码点的公式,反之亦然。来自https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae:
Section 3.7 of The Unicode Standard 3.0定义了转换代理对和从代理对转换的算法。
大于
C
的代码点0xFFFF
对应于代理对<H, L>
根据以下公式:H = Math.floor((C - 0x10000) / 0x400) + 0xD800 L = (C - 0x10000) % 0x400 + 0xDC00
反向映射,即从代理对
<H, L>
到Unicode 代码点C
,由下式给出:C = (H - 0xD800) * 0x400 + L - 0xDC00 + 0x10000
答案 1 :(得分:2)
给定一系列UTF-16代码单元(即16位数字,例如从String.utf16
获得或仅从数组中获取),您可以使用UTF16
类型及其{ {1}}方法将其转换为decode
,然后您可以将其转换为UnicodeScalars
。
这是一个有趣的项目,它接受一个生成器(因为它执行有状态处理)并返回一个枚举,指示结果(具有相关的标量类型),或错误或完成。 Swift 2.0模式匹配使其更易于使用:
String