1

概括

我正在为 iPhone 开发一个计算器应用程序,并希望将数学表达式绘制到 UIView,就像 LaTeX 外观一样。
所以我使用 cmr10.ttf(LaTeX 默认)作为绘图字体,但有些字符没有显示。

测试代码和细节

这是我的测试代码:

- (void)drawRect:(CGRect)rect
{
    [super drawRect:rect];

    const int len = 4;
    Byte cstr[len];
    cstr[0] = 0x30; // 0
    cstr[1] = 0x00; // Capital Gamma
    cstr[2] = 0x41; // A
    cstr[3] = 0x61; // a
    NSString *str = [[NSString alloc] initWithBytes:(const void*)cstr length:len encoding:NSASCIIStringEncoding];
    [str drawAtPoint:CGPointMake(10, 0) withFont:[UIFont fontWithName:@"cmr10" size:40]];
}

我曾期望向 UIView 显示“ 0ΓAa ”,但实际上显示“ 0Aa ”而没有大写 gamma。
根据 CMR10 代码表(见下文),0x00 表示大写 gamma。但在 ASCII 表中,0x00 表示 NUL 控制字符。这可能是未显示大写伽玛字符的原因。

这是CMR10的代码表。字母等一般字符与 ASCII 表的代码相同,但其他字符不同。

在此处输入图像描述

(来自http://www.tug.org/texlive//devsrc/Master/texmf-dist/doc/latex/base/encguide.pdf第 18 页)

问题

所以我想知道如何绘制一个字符代码与ASCII中的控制字符相同的字符。

附加信息

  • 我在 BaKoMa 字体包中使用了 cmr10.ttf。
  • 我正在 Xcode 4.6.1 和 iOS5 或更高版本的设备上开发这个计算器应用程序。
4

2 回答 2

1

drawAtPoint:应该透明地处理所有编码的东西,所以我希望以下工作:

NSString *str = @"0ΓAa";
[str drawAtPoint:CGPointMake(10, 0) withFont:[UIFont fontWithName:@"cmr10" size:40]];

更新:我现在已经下载了字体并测试了代码。真的行。

更新 2:它不起作用。但我已经使用“TTFdump”工具(来自Microsoft Typography 工具页面)检查了“cmr10.ttf”字体,发现以下内容:

该字体包含一个平台 ID = 3 和编码 ID = 1 的“cmap”表。根据http://www.microsoft.com/typography/otspec/cmap.htm,这应该是从 Unicode 到字形 ID 的映射. 但事实并非如此。例如,Unicode U+00A1 映射到字形 id 19,即“Gamma”字形。但“Gamma”的真正 Unicode 是 U+0393。

所以这

// 00A1 = Gamma, 00A8 = Upsilon, 00A3 = Theta, 00B0 = fl.
NSString *str = @"\u00A1\u00A8\u00A3\u00B0";
[str drawAtPoint:CGPointMake(10, 10) withFont:[UIFont fontWithName:@"cmr10" size:40]];

实际上显示来自 cmr10 字体的字符!

但是我没有发现这种奇怪的编码是从哪里来的。所以这更多是理论上的兴趣,CGFontGetGlyphWithGlyphName在 Daiki 的答案中使用 as 是更好的解决方案。

于 2013-04-08T13:29:21.490 回答
1

CGContextShowGlyphsAtPoint我找到了一种使用and来绘制具有控制字符代码的字符的方法CGFontGetGlyphWithGlyphName

例子:

CGContextRef context = UIGraphicsGetCurrentContext();

if (context) {

    CGFontRef font = CGFontCreateWithFontName(CFSTR("cmr10"));
    CGContextSetFont(context, font);
    CGContextSetFontSize(context, 40);
    CGAffineTransform transform = CGAffineTransformMake(1.0, 0.0, 0.0, -1.0, 0.0, 0.0);
    CGContextSetTextMatrix(context, transform);

    const int len = 4;
    CGGlyph glyphs[len];
    glyphs[0] = CGFontGetGlyphWithGlyphName(font, CFSTR("Gamma"));
    glyphs[1] = CGFontGetGlyphWithGlyphName(font, CFSTR("Upsilon"));
    glyphs[2] = CGFontGetGlyphWithGlyphName(font, CFSTR("Theta"));
    glyphs[3] = CGFontGetGlyphWithGlyphName(font, CFSTR("fl"));

    CGContextShowGlyphsAtPoint(context, 0, 50, glyphs, len);
    CGFontRelease(font);
}

第二个参数中的“Gamma”CGFontGetGlyphWithGlyphName是名为“post”的字形名称(参见http://scripts.sil.org/cms/scripts/page.php?item_id=IWS-Chapter08#05931f9d)。它在 cmr10.ttf 文件中定义。

我使用 TTFEdit 来查找字形名称。

  1. 启动 TTFEdit。
  2. 文件-> 打开。然后选择一个 TTF 文件并单击打开。
  3. 选择字形标签。
  4. 找到一个字符,然后将鼠标悬停在它上面并按住几秒钟。
  5. 字形名称将显示为提示。
于 2013-04-07T10:32:02.820 回答