Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OSX:CGGlyph到UniChar_C_Macos_Core Text - Fatal编程技术网

OSX:CGGlyph到UniChar

OSX:CGGlyph到UniChar,c,macos,core-text,C,Macos,Core Text,我目前正在使用CoreGraphics和CoreText编写一个简单的位图字体生成器。我正在检索具有以下内容的字体的字距表: CFDataRef kernTable = CTFontCopyTable(m_ctFontRef, kCTFontTableKern, kCTFontTableOptionNoOptions); 然后解析它,这很好。紧排对为我提供了紧排对的字形索引(即CGGlyph),我需要将它们转换为unicode(即UniChar),不幸的是,这似乎并不容易。我得到的最接近的结果

我目前正在使用CoreGraphics和CoreText编写一个简单的位图字体生成器。我正在检索具有以下内容的字体的字距表:

CFDataRef kernTable = CTFontCopyTable(m_ctFontRef, kCTFontTableKern, kCTFontTableOptionNoOptions);
然后解析它,这很好。紧排对为我提供了紧排对的字形索引(即CGGlyph),我需要将它们转换为unicode(即UniChar),不幸的是,这似乎并不容易。我得到的最接近的结果是:

CGFontCopyGlyphNameForGlyph
检索cglyph的glyph名称,但我不知道如何将名称转换为unicode,因为它们实际上只是诸如quoteleft之类的字符串。我想到的另一件事是自己解析
kCTFontTableCmap
以手动执行从glyph到unicode id的映射,但这似乎是一项繁重的额外工作。有什么简单的方法可以做到这一点吗


谢谢

我不知道如何直接获得给定字形的Unicode,但您可以 按以下方式构建映射:

  • 使用
    CTFontCopyCharacterSet()
    获取字体的所有字符
  • 使用
    CTFontGetGlyphsForCharacters()
    将所有这些Unicode字符映射到其字形
  • 对于每个Unicode字符及其字形,存储映射
    glyph->Unicode
    在字典里

我对您的答案投了赞成票,因为这似乎是解决这个问题的一种方法,它肯定比解析kCTFontTableCmap更简单。如果没有更好的答案,我会接受这个答案!非常感谢!这可能是正确的方向。主要问题是glyph->character不是1:1转换。例如,像“fi”这样的连字可能只有一个字形。没有这样的字符,那么您会将其映射到什么?Martin的方法是合理的,因为它为您提供了实际具有1:1字符映射的glyph子集。不要忘记,字符映射为无glyph是合法的(您可能会在返回的数组中得到0)。多个字符映射到同一个标志符是合法的(尽管我个人没有看到这种情况)。字体可能有组合字符的特殊规则。将å(U+00E5,上面带环的拉丁文小写字母A)表示为一个或两个字形是合法的。因此,在字符和字形之间映射时,您可能并不总能得到您所期望的结果。感谢Rob Napier的澄清,这非常有意义。我想我现在可以忽略结扎了。我现在接受了这个答案,因为我非常确定这是解决问题的方法!谢谢大家!连字不是特殊的unicode字符。虽然Unicode中内置了少量连字(例如,Œ),但大多数都不是。最常见的英文连字fi不是Unicode的一部分。字体可以自由生成任意连字(和do)。Zapfino字体以其七个字符的“Zapfino”连字而闻名(这是一个字形)。当然,事情是相反的。我最喜欢的Unicode字符,﷽ (U+FDFD,Basmala),当然可以分解成许多字形。