如何确定NSString中的字符是什么

时间:2013-08-16 21:52:19

标签: objective-c parsing nsstring escaping nslog

我运行的XML解析器会遇到类似<tag></tag><tag>content</tag>的内容。无论哪种方式,它都存储节点内容供以后使用。

在其他地方,我想检查内容是否为空。我认为一个空节点可能是@""甚至(null),但这些都不正确。

我希望能够确定NSString代表空节点的内容。 NSLogging NSString导致某种新行,但是对@"\n"@"\r"进行检查显示它不是那些。

那么有没有办法记录NSString的实际字符,包括转义序列?正如NSLog(@"\n");之类的内容会输出"\n"而不是新行。

2 个答案:

答案 0 :(得分:1)

我想到的一个(脏?)技巧是使用NSJSONSerialization的事实 转义所有控件和其他非ASCII字符:

NSString *foo = @"a\nb\rc d\t e\001\002";

NSData *json = [NSJSONSerialization dataWithJSONObject:@[foo] options:0 error:NULL];
NSString *escaped = [[NSString alloc] initWithData:json encoding:NSUTF8StringEncoding];
NSLog(@"%@", escaped);

输出:

["a\nb\rc d\t e\u0001\u0002"]

答案 1 :(得分:1)

Martin给你举例说明了如何记录角色。或者您可以将其存储在NSData中并以十六进制显示:

NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
NSLog(@"%@", data);

或者,如果您只想查看XML十六进制中的控制字符,但保持可打印字符不变,则可以使用CFStringTransform

NSMutableString *mutableString = [string mutableCopy];
CFStringTransform((__bridge CFMutableStringRef)mutableString, NULL, kCFStringTransformToXMLHex, NO);

但是在回答关于解析器遇到<tag></tag>时存储的内容的问题时,这一切都取决于您如何实现它(并告诉我们如果您有问题,您会采取什么行动)。但我们大多数人allocinit NSMutableString didStartElement,我们会在foundCharacters中追加字符串,然后将其存储在didEndElement的模型中{1}}。在那种情况下,该空标记将产生零长度可变字符串(例如@"",除了可变字符串)。你怎么断定它不是@""?如果您检查了[string isEqualToString:@""],那应该没问题。

顺便说一下,如果你想从你的结果中修剪额外的空格,你可以在didEndElement中执行以下操作:

self.modelObject.someStringProperty = [self.parsedString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];

这样,如果有任何额外的空格或换行符,它们就会被剥离。