我正在尝试将Unicode字符(使用自定义字体)放入一个字符串中然后使用Quartz显示,但XCode由于某种原因不喜欢转义码,而且我真的卡住了。
CGContextShowTextAtPoint (context, 15, 15, "\u0066", 1);
它不喜欢这个(拉丁文小写字母f)并且说它是“无效的通用字符”。
CGContextShowTextAtPoint (context, 15, 15, "\ue118", 1);
它并没有抱怨这一点,但没有显示任何内容。当我在FontForge中打开字体时,它会显示字形并且有效。 Font Book也很好地验证了字体。如果我使用TextEdit中的字体并使用字符查看器Unicode表放入Unicode字符,它看起来很好。 Just Quartz不会显示它。
为什么这不起作用?
答案 0 :(得分:1)
“无效的通用字符”错误是due to the definition in C99:基本上\uNNNN
转义应该允许一个程序员调用变量 føø
和另一个程序员(谁可能无法输入ø)将其称为f\u00F8\u00F8
。为了让每个人都能更轻松地进行解析,你不能使用\u
转义来控制角色或“基本角色集”中的角色(也许是从Java's unicode escapes学到的一个可以疯狂的教训结束评论等事情。
第二个错误可能是因为"\ue118"
被编译为UTF-8序列"\xee\x8e\x98"
- 三个char
。 CGContextShowTextAtPoint()
假设一个char
(字节)是一个字形,而CGContextSelectFont()
仅支持编码kCGEncodingMacRoman
(将字节解码为“Óéò”)和{{1} (任何人的猜测都会发生。文档说不要与kCGEncodingFontSpecific
或CGContextSetFont()
一起使用CGContextShowText()
(没有指定字符到字形的映射)。
如果您知道字形编号,则可以使用CGContextShowTextAtPoint()
,CGContextShowGlyphs()
或CGContextShowGlyphsAtPoint()
。
答案 1 :(得分:0)
我刚刚更改了字体,最后使用了标准的字母数字字符。更简单。