Cocoa 为什么NSString和NSLog处理%C和%lc(以及%S和%ls)的方式不同?
苹果的文件声称 NSString格式化方法和CFString格式化函数支持的格式说明符遵循…您还可以将这些格式说明符与NSLog函数一起使用 但是,虽然Cocoa 为什么NSString和NSLog处理%C和%lc(以及%S和%ls)的方式不同?,cocoa,unicode,formatting,printf,Cocoa,Unicode,Formatting,Printf,苹果的文件声称 NSString格式化方法和CFString格式化函数支持的格式说明符遵循…您还可以将这些格式说明符与NSLog函数一起使用 但是,虽然printf规范将%C定义为%lc的等价物,将%S定义为%ls的等价物,但只有%C和%S似乎可以正确使用NSLog和+[NSString-stringWithFormat://code> 例如,考虑下面的代码: #import <Foundation/Foundation.h> int main (int argc, const c
printf
规范将%C
定义为%lc
的等价物,将%S
定义为%ls
的等价物,但只有%C
和%S
似乎可以正确使用NSLog
和+[NSString-stringWithFormat://code>
例如,考虑下面的代码:
#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;
}
我是做错了什么,还是这是苹果代码中的错误?在Mac OS X上,
将wchar\u t
定义为int
,因此在所有当前支持的体系结构上都是四个字节(32位)
正如您所注意到的,printf
(3)手册页将%S
定义为等同于%ls
,它使用指向某些wchar\u t
字符(wchar\u t*
)的指针
但是,您链接到的Cocoa文档(及其CF等效文档)确实单独定义了%S
:
%S
:以空结尾的16位Unicode字符数组
重点补充。同样,%C
也是如此
所以,这不是一个bug。CF和Cocoa对%S
和%C
的解释不同于printf
及其近亲对它们的解释。CF和Cocoa将字符视为UTF-16,而printf
(大概)将字符视为UTF-32
在使用核心服务时,CF/Cocoa解释更有用,因为某些API(如文件管理器)会将文本作为UniChar
s数组而不是CFString传递给您;只要以null终止该数组,就可以将其与%S
一起使用来打印字符串。谢谢;这很有道理!我想我会在文档中将其描述为一个bug,因为在本例中,NSString格式化方法显然不遵循printf规范。这似乎是一个公平的评估吗;它应该说“……有一些变化”,并在表中标记它们。该文档在表中正确描述了CF/Cocoa的解释,尽管它没有将其标记为与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: