【问题标题】:Determining whether or not a font can render a Unicode character in Cocoa Touch确定字体是否可以在 Cocoa Touch 中呈现 Unicode 字符
【发布时间】:2011-02-10 20:58:04
【问题描述】:

有没有办法确定字体是否可以在 Cocoa 中呈现特定的 Unicode 字符?或者,是否可以指定默认替换字符?

【问题讨论】:

  • 你在和NSTextView一起工作吗?如果没有,你想用这些信息做什么?
  • 否;我希望能够在 iPhone OS 上突出显示或替换 UILabel 中不受支持的字符。
  • conmulligan:那你说的是Cocoa Touch,不是Cocoa。

标签: iphone objective-c cocoa-touch unicode uifont


【解决方案1】:

由于它是在 iOS 上,您可能需要构建或查找执行此操作的应用程序。 最终,如果任何单个字形的信息都存在于字体文件本身的表格中,那是相当低级的 C 工作。

构建一个检查字体并显示字形和字形索引(CGGlyph 或 NSGlyph 值)然后使用字形索引的工具要容易得多。

【讨论】:

    【解决方案2】:

    您可以将 CGFontGetGlyphWithGlyphName() 用于 iOS 旧版本的 iOS (2.0)。 Apple 似乎没有记录字形名称,但我相信它们对应于这个 Adob​​e 列表:

    http://partners.adobe.com/public/developer/en/opentype/glyphlist.txt

    例如,é (U+00E9) 的字形被命名为“eacute”,获取该字形的代码为:

    CFStringRef name = CFStringCreateWithCString(NULL, "eacute", kCFStringEncodingUTF8);
    CGGlyph glyph = CGFontGetGlyphWithGlyphName(font, name);
    

    【讨论】:

    • 有点晚了,但字形名称是特定于字体的,并且可能因字体而异(某些字体甚至可能根本不包含任何字形名称)。
    【解决方案3】:

    查看 Core Text 框架中的 CTFontGetGlyphsForCharacters。如果它为给定的 Unicode 字符的字形索引返回零,则该字体不支持该字符。如果找不到任何字形,该函数将返回 false。

    【讨论】:

    • Core Text 对我来说并不是一个真正的选择,因为它只被引入到 iPhone OS 的 iPad 版本 3.2。
    • 在这种情况下,您可以使用CGFontGetGlyphWithGlyphName,并传入一个仅包含相关字符的字符串。我不知道组合字符的规则是什么,例如 iPhone OS 3.1.3 上的 Helvetica 有一个 e 字形,但 é、´ 和组合重音符号返回零。
    • 这并不意味着字形不存在,更多的是字体文件中的表格映射字符到字形的反映。 Apple Symbols 字体就是一个很好的例子。它可能是精确用于提供大量有用字形的原始字体,这些字形仅位于字体文件中的字形索引处,但不一定映射到字符。这是熟悉 FontBook 和按字体索引的特定字体中的字形的地方。但对于 iOS,您可能需要找到或创建一个应用程序来帮助您查看特定字体索引处的字形。
    • @Tony é 就您正在查看的字体而言可能不是单个字符。它最终可能由 ´ 和 e 组成
    猜你喜欢
    • 2011-09-26
    • 2010-09-11
    • 1970-01-01
    • 2010-11-06
    • 2018-05-12
    • 1970-01-01
    • 2019-12-18
    • 2020-03-23
    • 2017-07-21
    相关资源
    最近更新 更多