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

时间:2015-07-08 02:47:11

标签: ios swift unicode scalar surrogate-pairs

以下示例取自Strings and Characters documentation

enter image description here

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

我试过

let myChar: Character = "\u{D83D}\u{DC36}"

但是我收到了“无效的Unicode标量”错误。

This Objective C answerthis project似乎是自定义解决方案,但Swift(特别是Swift 2.0+)中是否有内置的功能可以解决这个问题?

2 个答案:

答案 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