2

下面的示例应该适用于 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.
4

2 回答 2

4

%@如果要包含CFStringRefvia ,请使用CFStringCreateWithFormat

请参阅核心基础的字符串编程指南的格式说明符部分

  • %@适用于 Objective C 对象,ORCFTypeRef对象(CFStringRef兼容CFTypeRef
  • %s用于以空结尾的 8 位无符号字符数组(即普通 C 字符串)。
  • %S用于 16 位 Unicode 字符的以 null 结尾的数组。

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

于 2010-01-08T14:08:50.877 回答
2

作为对另一个答案中评论的回答,我会推荐海报

  • 以可移植的方式生成一个 UTF8 字符串到char*
  • 并在最后一分钟将其转换为CFString使用CFStringCreateWithCStringwithkCFStringEncodingUTF8作为编码。

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

很抱歉我为这个小话题写了这么多,但很遗憾几年前有很多不错的应用程序无法在日文/韩文 Mac 上运行,因为只是这种“系统编码”。如果您有兴趣,请参阅我几年前写的详细说明。

于 2010-01-09T01:53:58.623 回答