【问题标题】:Converting a NSString to a cString for use with CGContextShowTextAtPoint将 NSString 转换为 cString 以用于 CGContextShowTextAtPoint
【发布时间】:2023-03-28 21:48:02
【问题描述】:

我正在使用 CGContextShowTextAtPoint 绘制一个字符串。因此,我需要将要绘制的 NSString 转换为 c 字符串。不幸的是,欧元货币符号等特殊符号未正确显示。

CGContextSelectFont(currentContext, "TrebuchetMS", 15, kCGEncodingMacRoman);

CGContextShowTextAtPoint(currentContext, 0, 0, [myString cStringUsingEncoding:[NSString defaultCStringEncoding]], [myString length]);

我在 CGContextSelectFont 函数中使用 kCGEncodingFontSpecific 编码进行了尝试,但也没有用。

出于性能原因,我需要使用 CG 函数,而不是 NSString 提供的 drawInRect 函数。

也许你能帮帮我!

PS:我知道这是一个经常发布的话题,但我不知道为什么我不能让它发挥作用......

【问题讨论】:

  • 两件事:1. 不能保证 defaultCStringEncoding 是 UTF-8 还是 MacRoman,2. 作为最后一个参数传递给 CGContextShowTextAtPoint() 的长度应该是 C 字符串的长度(以字节为单位) ,而不是 NSString 的字符长度。
  • 是的,对于 MacRoman 编码,您需要使用 NSMacOSRomanStringEncoding 而不是 [NSString defaultCStringEncoding]。

标签: iphone objective-c core-graphics


【解决方案1】:

您所指的“特殊符号”受 NSString 的 Unicode 编码支持,但不支持您的 Core Graphics 字体绘制例程使用的 MacRoman 编码(您可以使用 CGContextSelectFont() 设置的唯一两种编码是 kCGEncodingMacRoman 和 kCGEncodingFontSpecific )。这是绘制文本的 CGContextShowTextAtPoint() 路由的缺点。因此,每当我需要在 Core Graphics 上下文中手动绘制文本时,我都会使用 NSString 的 -drawAtPoint: 方法。

就性能而言,在an earlier answer 的评论中,Kyle 对 drawAtPoint: 进行了基准测试:每秒绘制 75 次,而 CGContextShowTextAtPoint() 每秒绘制 99 次。这在绘制速度上并没有太大的差异,所以你不会通过这种方式获得很多。根据我的经验,-drawAtPoint: 对于我的应用程序来说已经足够快了。

编辑(2009 年 10 月 14 日):正如 Sixten Otto 所指出的,我误读了自己的代码。 UTF-8 确实支持完整的字符范围,字体的 MacRoman 不支持。

【讨论】:

  • 那么如果我使用 unicode 编码将我的 NSStrings 转换为 c 字符串,问题会不会得到解决?
  • 取决于 CoreGraphics 文本绘图 a) 是否支持 Unicode,以及 b) 是否会从其他字体中提取缺失的字形。 TrebuchetMS 可能没有您尝试绘制的所有字符的字形。同样,使用 NSString 方法会更好。
  • 我更正了关于 UTF-8 编码的答案。我在那里弄错了。字体的 MacRoman 编码不支持大部分 Unicode 字符集。
  • 我会试试 drawInRect 方法。不确定它们是否适合我。
猜你喜欢
  • 2011-04-30
  • 1970-01-01
  • 1970-01-01
  • 2012-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-26
  • 2015-08-23
  • 2015-08-07
相关资源
最近更新 更多