2

我已经回顾了诸如获取字符串的长度为什么表情符号字符像

4

2 回答 2

2

如果您在不支持 Fitzpatrick 修饰符的系统上打印会发生什么?您会被系统用于未知字符占位符的任何内容所跟踪。

所以我认为要回答这个问题,你必须咨询你系统的排版员。对于 Apple 平台,您可以使用 Core Text 创建 aCTLine然后计算行的字形运行。例子:

import Foundation
import CoreText

func test(_ string: String) {
    let richText = NSAttributedString(string: string)
    let line = CTLineCreateWithAttributedString(richText as CFAttributedString)
    let runs = CTLineGetGlyphRuns(line) as! [CTRun]
    print(string, runs.count)
}

test("" + "")
test("A" + "")
test("B\u{0300}\u{0301}\u{0302}" + "")

macOS 10.14.6 Beta (18G48f) 上 Xcode 10.2.1 中 macOS 操场的输出:

 1
A 2
B̀́̂ 2
于 2019-06-19T22:37:41.580 回答
0

我认为可以通过查看修饰符是否存在以及如果存在是否增加了字符数来推断这一点。

例如:

let tonedThumbsUp = "" + ""
let tonedA = "A" + ""
tonedThumbsUp.count // 1
tonedThumbsUp.unicodeScalars.count // 2
tonedA.count //2
tonedThumbsUp.unicodeScalars.count //2
let c = "\u{1F3FB}"
tonedThumbsUp.contains(c) // true
tonedA.contains(c) // true

好的,所以它们都包含一个修饰符,它们都包含两个 unicode 标量,但一个是计数 1,另一个是计数 2。当然,这是一个有用的区别。

于 2019-06-20T05:22:47.427 回答