CFStringCreateWithFormat期望什么样的字符串作为参数?

时间:2010-01-08 13:33:46

标签: macos unicode printf cfstring

下面的示例应该与Unicode字符串一起使用,但它不适用。


CFStringRef aString =  CFSTR("one"); // in real life this is an Unicode string
CFStringRef formatString = CFSTR("This is %s example"); // also tried %S but without success
CFStringRef resultString = CFStringCreateWithFormat(NULL, NULL, formatString, aString);

// Here I should have a valid sentence in resultString but the current result is like aString would contain garbage.

2 个答案:

答案 0 :(得分:4)

如果您想通过%@加入CFStringRef,请使用CFStringCreateWithFormat

请参阅the Format Specifiers section of Strings Programming Guide for Core Foundation

  • %@适用于Objective C对象,或CFTypeRef个对象(CFStringRefCFTypeRef兼容)
  • %s用于8位无符号字符的空终止数组(即普通C字符串)。
  • %S用于以16位Unicode字符的空终止数组。

CFStringRef对象与“以16位Unicode字符的空终止数组”不同。

答案 1 :(得分:2)

作为对其他答案中评论的回答,我建议海报

  • 以便携方式生成UTF8字符串到char*
  • 并在最后一分钟,使用CFStringCFStringCreateWithCString转换为kCFStringEncodingUTF8作为编码。

请不要在%s中使用CFStringCreateWithFormat。请不要依赖“系统编码”,即西欧环境中的MacRoman,而不是其他语言。系统编码的概念本质上是脑死亡的,特别是在东亚环境(我来自),甚至修改了ASCII码范围内的字符(低于127!)。如果依靠“系统编码”,地狱就会松动。幸运的是,自10.4以来,所有使用“系统编码”的方法现已弃用,除了 %s ....

对不起,我为这个小话题撰写了这么多内容,但几年前有很多不错的应用程序因为这种“系统编码”而无法在日语/韩语Mac上运行,这真的很可惜。 “如果您有兴趣,请参阅几年前我写的this detailed explanation