1

概要

私はiPhone用の電卓アプリを開発しており、LaTeXの外観と同じようにUIViewに数式を描画したいと考えています。
そのため、描画用のフォントとして 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 テーブルと同じコードですが、その他は異なります。

ここに画像の説明を入力

( 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 にマップされます。しかし、「ガンマ」の実際の 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、大樹の答えで as を使用することがより良い解決策です。

于 2013-04-08T13:29:21.490 に答える
1

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);
}

の 2 番目の引数の「ガンマ」CGFontGetGlyphWithGlyphNameは、「post」と呼ばれるグリフ名です ( http://scripts.sil.org/cms/scripts/page.php?item_id=IWS-Chapter08#05931f9dを参照)。cmr10.ttf ファイルで定義されています。

TTFEdit を使用してグリフ名を見つけました。

  1. TTFEdit を起動します。
  2. ファイル -> 開く。次に、TTF ファイルを選択して [開く] をクリックします。
  3. glyfタブを選択します。
  4. キャラクターを見つけてマウスオーバーし、数秒間押し続けます。
  5. グリフ名がヒントとして表示されます。
于 2013-04-07T10:32:02.820 に答える