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+)中是否有任何内容可以做到这一点?
有一些公式可以基于代理对来计算原始代码点,反之亦然。来自https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae:
Unicode标准3.0的3.7节定义了代理对之间的转换算法。
根据以下公式,
C大于的代码点0xFFFF对应于代理对<H, L>:Run Code Online (Sandbox Code Playgroud)H = Math.floor((C - 0x10000) / 0x400) + 0xD800 L = (C - 0x10000) % 0x400 + 0xDC00反向映射(即从代理对
<H, L>到Unicode代码点C)由以下方式给出:Run Code Online (Sandbox Code Playgroud)C = (H - 0xD800) * 0x400 + L - 0xDC00 + 0x10000
给定一个 UTF-16 代码单元序列(即 16 位数字,例如从String.utf16数字数组中获取的数字),您可以使用该UTF16类型及其decode方法将其转换为UnicodeScalars,然后将其转换为String.
它\xe2\x80\x99 是一个有点蹩脚的项目,它需要一个生成器(因为它进行有状态处理)并返回一个指示结果(具有相关标量类型)的枚举,或者一个错误或完成。Swift 2.0 模式匹配使它更容易使用:
\n\nlet 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 \nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
1308 次 |
| 最近记录: |