检测何时无法正确显示Unicode字符

Jor*_*n H 6 unicode ios swift watchkit

某些unicode字符无法在iOS上显示,但可以在macOS上正确显示。同样,iOS可以显示的某些unicode字符无法在watchOS上显示。这是由于这些平台上安装了不同的内置字体。

如果无法显示字符,它将显示为?在盒子里,就像这样:
在此处输入图片说明

我还看到有些字符显示为外星人(不确定为什么会有所不同):
在此处输入图片说明

有没有办法知道给定的Unicode字符字符串,何时特定的Unicode字符不能正确显示"?"?

我需要适用于iOS和watchOS的解决方案。

一二三*_*一二三 5

您可以使用CTFontGetGlyphsForCharacters()来确定字体是否具有特定代码点的字形(请注意,补充字符需要作为代理对进行检查):

CTFontRef font = CTFontCreateWithName(CFSTR("Helvetica"), 12, NULL);
const UniChar code_point[] = { 0xD83C, 0xDCA1 };  // U+1F0A1
CGGlyph glyph[] = { 0, 0 };
bool has_glyph = CTFontGetGlyphsForCharacters(font, code_point, glyph, 2);
Run Code Online (Sandbox Code Playgroud)

或者,在 Swift 中:

let font = CTFontCreateWithName("Helvetica", 12, nil)
var code_point: [UniChar] = [0xD83C, 0xDCA1]
var glyphs: [CGGlyph] = [0, 0]
let has_glyph = CTFontGetGlyphsForCharacters(font, &code_point, &glyph, 2)
Run Code Online (Sandbox Code Playgroud)

如果要检查系统将尝试从中加载字形的完整后备字体集,则需要检查CTFontCopyDefaultCascadeListForLanguages(). 查看此问题的答案,了解有关如何创建后备字体列表的信息。