我正在尝试使用Core Graphics将Euro符号输出到PDF。我有以下代码,它使用NSMacOSRomanStringEncoding(我必须使用它来使£和$符号正确显示),但欧元符号出现为¤
CGRect pageRect = CGRectMake(0, 0, 800, 1150);
CFMutableDataRef pdfData = (CFMutableDataRef) [NSMutableData dataWithCapacity:0];
CGDataConsumerRef dataConsumer = CGDataConsumerCreateWithCFData(pdfData);
CGContextRef pdfContext = CGPDFContextCreate(dataConsumer, &pageRect, nil);
CGContextSelectFont(pdfContext, "Helvetica", 15, kCGEncodingMacRoman);
CGContextSetTextDrawingMode (pdfContext, kCGTextFill);
CGContextSetRGBFillColor (pdfContext, 0, 0, 0, 1);
const char *ctext = [@"€" cStringUsingEncoding:NSMacOSRomanStringEncoding];
CGContextShowTextAtPoint(pdfContext, 10, 10, ctext, strlen(ctext));
答案 0 :(得分:2)
这是因为默认情况下MacRomanEncoding
不包含欧元符号,请参阅“PDF参考1.7”中的引用(第D.1节拉丁字符集和编码):
- 在PDF 1.3中,欧元字符已添加到Adobe标准拉丁字符集中。它在WinAnsiEncoding中编码为200,在PDFDocEncoding中编码为240,分配以前未使用的代码。 Apple将代码333的Mac OS拉丁文编码从货币字符更改为欧元字符。但是,这种不兼容的更改并未反映在PDF的MacRomanEncoding中,后者继续将代码333映射到货币。如果需要欧元字符,可以使用编码字典来指定与MacRomanEncoding的这一差异。
醇>
答案 1 :(得分:0)
您应该能够使用CGContextShowGlyphsAtPoint
来绘制欧元符号。问题是您需要将CGGlyph
作为输入传递给该函数,而不是Unicode字符。此外,从Unicode字符到CGGlyphs
的映射是字体相关的,通常是非常重要的。 (有时它是一个简单的偏移,您可以根据反复试验来猜测。)
看起来Core Text有一个可能执行转换的函数CTFontGetGlyphsForCharacters
;但我从未在实践中使用它:
另外:如果您使用CGContextShowGlyphsAtPoint
,则需要将CGContextSelectFont
的来电替换为CGContextSetFont
和CGContextSetFontSize
。