Cocoa 为什么NSString和NSLog处理%C和%lc(以及%S和%ls)的方式不同?

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

苹果的文件声称

NSString格式化方法和CFString格式化函数支持的格式说明符遵循…您还可以将这些格式说明符与NSLog函数一起使用

但是,虽然
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: