繁体   English   中英

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

[英]How to convert surrogate pair to Unicode scalar in Swift

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

在此输入图像描述

55357U+D83D ,十六进制)和56374U+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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM