Ваш синтаксис правильный. NSString просто плохо обрабатывает NULL
байт. Я не могу найти какую-либо документацию по этому поводу, но NSString будет молча игнорировать спецификаторы формата %c
с аргументом 0
(и на этом примечании символьная константа '\0'
расширяется до целого числа 0
; это правильно ). Однако он может обрабатывать \0
, непосредственно встроенный в литерал NSString.
См. Этот код:
#import <Cocoa/Cocoa.h>
int main (int argc, char const *argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSString *stringByChars = [NSString stringWithFormat:@"-%c%c%c%c-",0,0,0,0];
NSString *stringByEscapes = [NSString stringWithFormat:@"-\0\0\0\0-"];
NSLog(@" stringByChars: \"%@\"", stringByChars);
NSLog(@" len: %d", [stringByChars length]);
NSLog(@" data: %@", [stringByChars dataUsingEncoding:NSUTF8StringEncoding]);
NSLog(@"stringByEscapes: \"%@\"", stringByEscapes);
NSLog(@" len: %d", [stringByEscapes length]);
NSLog(@" data: %@", [stringByEscapes dataUsingEncoding:NSUTF8StringEncoding]);
[pool drain];
return 0;
}
возвращается:
stringByChars: "--"
len: 2
data: <2d2d>
stringByEscapes: "-
len: 6
data: <2d000000 002d>
(Обратите внимание, что поскольку stringByEscapes
на самом деле содержит NULL
байтов, он рано завершает строку NSLog).