對于背景關系,我正在嘗試創建從字串代碼點到表情符號的映射,并且需要知道系統是否支持表情符號:
("1F9AE") -> "??"
("1FAE0") -> "??" (iOS 15.4 ) / nil (if below 15.4, since it would show as "??")
("1F415-200D-1F9BA") -> "?????"
("1F415-1F9BA") -> nil (since it would normally be "????", which isn't a single emoji)
我已經讓它與單代碼點案例一起使用:
func emoji(for codepoint: String) -> String? {
guard let int = Int(codepoint, radix: 16),
let scalar = UnicodeScalar(int),
scalar.properties.isEmoji
else { return nil }
return String(scalar)
}
但是,我無法弄清楚isEmoji使用多個代碼點進行的相應檢查是什么。
// assume I had to make these scalars via a `String`
let scalars = [UnicodeScalar(0x1F415)!, UnicodeScalar(0x200D)!, UnicodeScalar(0x1F9BA)!]
let scalarView = String.UnicodeScalarView(scalars)
// How can I check that this `UnicodeScalarView` is for single, supported emoji, since I can't check `isEmoji`?
print(String(scalarView))
例如,"1FAE0-1F3FD"應該是nil,因為它不是單個表情符號 ( "????")。但是,在未來的版本中,融化的臉可能會與皮膚變化一起使用,在這種情況下,它應該回傳單個有效的表情符號。
uj5u.com熱心網友回復:
根據 Emoji 14.0 的資料檔案,一個表情符號要么是基本表情符號、鍵帽序列、標志、修飾符序列或 ZWJ 序列。在每一種情況下,序列中都會有至少一個代碼點isEmoji回傳true,并且該序列將形成一個單一的字形(一個單一的 Swift Character)。
因此,您應該首先從 unicode 標量中創建一個字串:
let scalars = [UnicodeScalar(0x1F415)!, UnicodeScalar(0x200D)!, UnicodeScalar(0x1F9BA)!]
let scalarView = String.UnicodeScalarView(scalars)
let string = String(scalarView)
然后,您可以檢查它是否是這樣的表情符號:
string.count == 1 && string.unicodeScalars.contains { $0.properties.isEmoji }
或者,由于您只是想檢查 emoji 是否可以正常顯示,您可以使用CTFontGetGlyphsForCharactersApple Color Emoji 來查看這些字符是否支持。
let font = UIFont(name: "AppleColorEmoji", size: 20)! as CTFont
var text = Array(string.utf16)
var glyphs = Array(repeating: 0 as CGGlyph, count: text.count)
let isEmoji = CTFontGetGlyphsForCharacters(font, &text, &glyphs, text.count) &&
string.count == 1
請注意,這兩種方法都會回傳誤報(非表情符號,如 ASCII 字母被報告為表情符號),但不會回傳誤報。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/467305.html
下一篇:將字串決議為列
