Символ Unicode Не Отображается

Я хочу отобразить символ "бесконечность" с помощью

CGContextSelectFont(context, "HelveticaNeue", textSize, kCGEncodingMacRoman);    
CGContextShowTextAtPoint(context, myCenter.x, myCenter.y + textHeight, [sName     cStringUsingEncoding:NSMacOSRomanStringEncoding], [sName length]); 

отображается в виде квадрата или круга. Я узнал, что этот символ находится в десятичном 176 и 221E в шестнадцатеричном формате. Я использую Helvetica в качестве шрифта и пробовал другие без успеха. Это проблема с кодировкой, которую я использую?

4 ответов


оказывается, что CGContextSelectFont поддерживает только кодировку Макромена, которая в основном имеет только небольшой набор символов. Для отображения символов Юникода в строке необходимо использовать CGSetFont или систему рисования Cocoa. CGSetFont требует, чтобы вы все равно использовали Cocoa для сопоставления символов с глифами, а затем рисовали глифы с помощью CGContextShowGlyphsAtPoint. Я рекомендую вам изучить другие способы рисования этих строк, Если вам действительно нужно отобразить Unicode письмена.

этот код в основном будет отображать символ бесконечности:

- (void)drawRect:(CGRect)rect {
    unichar inf = 0x221E; // infinity symbol
    NSString* sName = [[NSString alloc] initWithCharacters:&inf length:1];
    UIFont* font = [UIFont fontWithName:@"Helvetica" size:32.0];
    [sName drawInRect:CGRectMake(20, 20, 40, 40)
             withFont:font];
    [sName release];
}

также обратите внимание, что на iPhone (и на Mac) Helvetica Neue фактически не существует... его название просто сопоставляется со стандартной Helvetica. Смотрите таблицу вhttp://daringfireball.net/misc/2007/07/iphone-osx-fonts для получения дополнительной информации о доступных шрифтах на iPhone.


стоит отметить, что вы все еще можете использовать функции CGContext вместе с -[NSString drawwwithrect:] и его двоюродными братьями. Например, следующий код рисует строку (которая может включать любые символы, включая символ бесконечности, который начал эту тему) с 50%-непрозрачный черный:

CGContextSaveGState(context);
CGContextSetRGBFillColor(context, 0, 0, 0, 0.5);
[self.text drawInRect:targetRect withFont:self.font];
CGContextRestoreGState(context);

вот ответ MonoTouch:

UIGraphics.PushContext (mBmpContext);
mBmpContext.SetRGBFillColor(1f,1f,1f,1f);
var font = UIFont.FromName ("Arial", 30);
using (var nsstr = new NSString ("äöü ÜÖÄ")){
   nsstr.DrawString (new PointF (10, 400), font);
}
UIGraphics.PopContext ()

вы хотите, чтобы избежать drawInRect:withFont: (в есть некоторые подробности: шнурок (шпагат, RectangelF, UIFont шрифт) как этот API до тех пор, пока троянца iPhoneOS 4.0 не оказывает строки, которые могут содержать некоторые символы Unicode (как "со странностями") и будут молча резать отображения в этой точке.

вместо этого вы должны использовать drawInRect:withFont:lineBreakMode:alignment: (в MonoTouch это шнурок (строка msg, прямоугольник rect, шрифт UIFont, uilinebreakmode breakMode, uitextalignment align) метод) как это делает правильно.

кроме того, не все шрифты на iPhone-это полный набор шрифтов, вы можете использовать следующую ссылку:

http://daringfireball.net/misc/2007/07/iphone-osx-fonts

список шрифтов, которые имеют полный набор символов.