Iphone 如何在iOS中绘制LaTeX字体(cmr10.ttf)的特殊字符? 总结

Iphone 如何在iOS中绘制LaTeX字体(cmr10.ttf)的特殊字符? 总结,iphone,ios,nsstring,latex,special-characters,Iphone,Ios,Nsstring,Latex,Special Characters,我正在为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

我正在为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”,没有大写字母 根据CMR10代码表(见下文),0x00表示资本伽马。但在ASCII表中,0x00表示NUL控制字符。这可能就是为什么没有显示大写伽马字符

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

(摘自第18页,共页)

问题: 所以我想知道的是如何画一个字符,这个字符代码和ASCII中的控制字符相同

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

我找到了一种通过使用
CGContextShowGlyphsAtPoint
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);
}
CGFontGetGlyphWithGlyphName
的第二个参数中的“Gamma”是称为“post”的字形名称(请参阅)。它在cmr10.ttf文件中定义

我使用TTFEdit查找字形名称

  • 启动TTFEdit
  • 文件->打开。然后选择一个TTF文件并单击打开
  • 选择glyf选项卡
  • 找到一个字符,然后将鼠标移到该字符上并按住几秒钟
  • 字形名称将显示为提示

  • drawAtPoint:
    应该透明地处理所有编码内容,所以我希望 以下几点需要注意:

    NSString *str = @"0ΓAa";
    [str drawAtPoint:CGPointMake(10, 0) withFont:[UIFont fontWithName:@"cmr10" size:40]];
    
    更新:我现在已经下载了字体并测试了代码。它确实有效


    更新2:它不起作用,谢谢你的回答和测试:)我试过那个代码,但大写伽马是用另一种字体(不是cmr10)绘制的。“0”、“A”和“A”是用cmr10正确绘制的。@DaikiKomatsuda:你是对的,我没有注意到区别。我会看看我是否能在以后找到答案,否则你就有了有效的解决方案。@Daikikikomatsuda:我已经在我的答案中添加了一些信息。它没有解决问题,但解释了为什么通常的方法不起作用(TrueType字体中的cmap编码错误)。您的新方法非常简单。我认为这对于一些特殊的角色来说也是更好的。对于许多类型的字符,我的解决方案可能很容易阅读。谢谢