Apple的String Format Specifiers文件声称,
NSString格式化方法和CFString格式化函数支持的格式说明符遵循IEEE printf specification; ...您也可以将这些格式说明符与NSLog函数一起使用。
但是,虽然printf
规范将%C
定义为%lc
的等效项,%S
定义为%ls
的等效项,但只有%C
并且%S
似乎与NSLog
和+[NSString stringWithFormat:]
一起正常使用。
例如,请考虑以下代码:
#import <Foundation/Foundation.h>
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
unichar str[3];
str[0] = 63743;
str[1] = 33;
str[2] = (unichar)NULL;
NSLog(@"NSLog");
NSLog(@"%%S: %S", str);
NSLog(@"%%ls: %ls", str);
NSLog(@"%%C: %C", str[0]);
NSLog(@"%%lc: %lc", str[0]);
NSLog(@"\n");
NSLog(@"+[NSString stringWithFormat:]");
NSLog(@"%%S: %@", [NSString stringWithFormat:@"%S", str]);
NSLog(@"%%ls: %@", [NSString stringWithFormat:@"%ls", str]);
NSLog(@"%%C: %@", [NSString stringWithFormat:@"%C", str[0]]);
NSLog(@"%%lc: %@", [NSString stringWithFormat:@"%lc", str[0]]);
[pool drain];
return 0;
}
鉴于printf
规范,我希望上面的每一对都打印相同的东西。但是,当我运行代码时,我得到以下输出:
2009-03-20 17:00:13.363 UnicharFormatSpecifierTest[48127:10b] NSLog
2009-03-20 17:00:13.365 UnicharFormatSpecifierTest[48127:10b] %S: !
2009-03-20 17:00:13.366 UnicharFormatSpecifierTest[48127:10b] %ls: ˇ¯!
2009-03-20 17:00:13.366 UnicharFormatSpecifierTest[48127:10b] %C:
2009-03-20 17:00:13.367 UnicharFormatSpecifierTest[48127:10b] %lc:
2009-03-20 17:00:13.367 UnicharFormatSpecifierTest[48127:10b]
2009-03-20 17:00:13.368 UnicharFormatSpecifierTest[48127:10b] +[NSString stringWithFormat:]
2009-03-20 17:00:13.368 UnicharFormatSpecifierTest[48127:10b] %S: !
2009-03-20 17:00:13.369 UnicharFormatSpecifierTest[48127:10b] %ls: ˇ¯!
2009-03-20 17:00:13.369 UnicharFormatSpecifierTest[48127:10b] %C:
2009-03-20 17:00:13.370 UnicharFormatSpecifierTest[48127:10b] %lc:
我做错了什么,或者这是Apple代码中的错误?
答案 0 :(得分:6)
在Mac OS X上,<machine/_types.h>
将wchar_t
定义为int
,因此它在所有当前支持的体系结构上为4个字节(32位)。
正如您所注意到的,printf
(3)联机帮助页将%S
定义为等同于%ls
,它指向某些wchar_t
个字符(wchar_t *
)。
您链接到的Cocoa文档(及其CF等价物)确实单独定义%S
:
%S
: 16位 Unicode字符的空终止数组
重点补充。此外,%C
也是如此。
所以,这不是一个错误。 CF和Cocoa解释%S
和%C
与printf
及其堂兄弟解释它们的方式不同。 CF和Cocoa将字符视为UTF-16,而printf
(可能)将它们视为UTF-32。
使用Core Services时,CF / Cocoa解释更有用,因为某些API(例如文件管理器)会将文本作为UniChar
的数组传递给您,而不是CFString;只要您终止该数组,就可以将其与%S
一起使用来打印字符串。