[英]How to convert surrogate pair to Unicode scalar in Swift
以下示例取自字符串和字符文档 :
值55357
( U+D83D
,十六进制)和56374
( U+DC36
,十六进制)是形成Unicode标量U+1F436
的代理对,即DOG FACE
字符。 有没有办法走向另一个方向? 也就是说,我可以将代理对转换为标量吗?
我试过了
let myChar: Character = "\u{D83D}\u{DC36}"
但是我收到了“无效的Unicode标量”错误。
这个Objective C答案和这个项目似乎是自定义解决方案,但Swift(尤其是Swift 2.0+)中是否有任何内容可以做到这一点?
存在基于代理对计算原始代码点的公式,反之亦然。 来自https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae :
Unicode标准3.0的3.7节定义了转换代理对和从代理对转换的算法。
大于
0xFFFF
代码点C
对应于代理对<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
给定一系列UTF-16代码单元(即16位数字,例如你从String.utf16
获得或只是一个数组),你可以使用UTF16
类型及其decode
方法将其转换为UnicodeScalars
,你然后可以转换为String
。
这是一个有趣的项目,它接受一个生成器(因为它执行有状态处理)并返回一个枚举,指示结果(与标量的关联类型),或错误或完成。 Swift 2.0模式匹配使它更容易使用:
let u16data: [UInt16] = [0xD83D,0xDC36]
//or let u16data = "Hello, 🌍".utf16
var g = u16data.generate()
var s: String = ""
var utf16 = UTF16()
while case let .Result(scalar) = utf16.decode(&g) {
print(scalar, &s)
}
print(s) // prints 🐶
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.