Iphone Unicode字符不显示

Iphone Unicode字符不显示,iphone,cocoa-touch,encoding,Iphone,Cocoa Touch,Encoding,我想使用 CGContextSelectFont(context, "HelveticaNeue", textSize, kCGEncodingMacRoman); CGContextShowTextAtPoint(context, myCenter.x, myCenter.y + textHeight, [sName cStringUsingEncoding:NSMacOSRomanStringEncoding], [sName length]); 它显示为方形框或圆形。我

我想使用

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

它显示为方形框或圆形。我发现这个符号是十六进制格式的十进制176和221E。我使用Helvetica作为我的字体,并尝试过其他字体,但没有成功。这是我使用的编码的问题吗?

事实证明,CGContextSelectFont只支持MacRoman编码,基本上只有一小部分字符。为了在字符串中显示Unicode字符,必须使用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。有关iPhone上可用字体的更多信息,请参见中的表格。

值得注意的是,您仍然可以与-[NSString drawWithRect:]及其类似项一起使用CGContext函数。例如,以下代码使用50%不透明黑色绘制字符串(可以包括任何字符,包括启动此线程的无穷大符号):

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

您希望避免drawInRect:withFont:(在MonoTouch中:DrawString(string、RectangelF、UIFont字体)作为此API,直到iPhoneOS 4.0不呈现可能包含某些unicode字符的字符串(如Dingbat)并将在该点无声地剪切呈现

相反,您必须使用drawInRect:withFont:lineBreakMode:alignment:(在MonoTouch中,这是DrawString(string msg、RectangleF rect、UIFont font、UILineBreakMode breakMode、UITextAlignment)方法),因为这样可以正确渲染

此外,并非iPhone上的所有字体都是一套完整的字体,您可以使用以下参考:


查看包含完整字符集的字体列表。

以下是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 ()

我在下面更新了我的答案…结果表明CGContextSetFont实际上只适用于MacRoman编码,这不是您需要的。您需要Unicode编码,这意味着您必须使用核心文本或其他方法来显示Unicode字符。这就是我初始化sName的方式:NSString*sName=[NSString stringWithUTF8String:“\xE2\x88\x9E”];并改变你在这里的建议,我没有得到正方形或空白,我得到了一个奇怪的字符,但它不是无穷大符号。我还缺少什么?这真的很奇怪…我在这里得到了正确的字符。你得到了什么符号?他们做了很多工作,使NSString的应用工具包和UIKit附加组件在绘图方面表现更好…bu使用CGContext函数通常会比UIKit函数执行得更好。也就是说,我的建议是用最简单的方法执行,然后在实际出现性能问题时对其进行调整。