我正在为财富文件编写解析器。 Fortune是* nix平台上的一个小应用程序,只是打印出随机的“财富”。财富文件是直文,每个财富在自己的行上以百分号分隔。例如:
A little suffering is good for the soul.
-- Kirk, "The Corbomite Maneuver", stardate 1514.0
%
A man either lives life as it happens to him, meets it head-on and
licks it, or he turns his back on it and starts to wither away.
-- Dr. Boyce, "The Menagerie" ("The Cage"), star date unknown
%
我发现在解析文件时,stringWithContentsOfFile会返回一个包含%符号的字符串。例如:
@"A little suffering is good for the soul.\n\t\t-- Kirk, \"The Corbomite Maneuver\", stardate 1514.0\n%\nA man either lives life as it happens to him, meets it head-on and\nlicks it, or he turns his back on it and starts to wither away.\n\t\t-- Dr. Boyce, \"The Menagerie\" (\"The Cage\"), stardate unknown\n%"
但是,当我在文件内容上调用componentsSeparatedByCharactersInSet时,所有内容都被解析为字符串,百分号除外,它们是NSTaggedPointerString。当我打印出线条时,百分号就消失了。
这是因为百分号是字符串的格式说明符吗?在那种情况下,我认为初始内容拉动会逃避这些。
以下是代码:
NSFileManager *fileManager;
fileManager = [NSFileManager defaultManager];
NSStringEncoding stringEncoding;
// NSString *fileContents = [NSString stringWithContentsOfFile:fileName encoding:NSASCIIStringEncoding error:nil];
NSString *fileContents = [NSString stringWithContentsOfFile:fileName usedEncoding:&stringEncoding error:nil];
NSArray *fileLines = [fileContents componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]];
使用的编码最终为UTF-8。您可以看到我也尝试过指定纯ASCII,但它会产生相同的结果。
所以问题是,我如何保留百分号?或者,我可以将它用作分隔符,然后分别解析每个后续结果。
答案 0 :(得分:1)
您正在调用NSLog()
,但将行字符串作为格式字符串传递。类似的东西:
NSLog(lineString);
因此,行字符串中的任何百分比字符都被解释为格式说明符。你应该(几乎)永远不会传递来自外部源的字符串 - 即代码中没有硬编码的字符串 - 作为任何函数的格式字符串(NSLog()
,printf()
,+[NSString stringWithFormat:]
等)。它不安全,你有时会得到意想不到的结果,就像你见过的那样。
您应始终记录如下所示的单个字符串:
NSLog(@"%@", lineString);
也就是说,您需要传递硬编码格式字符串,并使用外部字符串作为数据进行格式化。
答案 1 :(得分:0)
NSTaggedPointerString只是NSString的子类。您可以在任何地方使用NSString。
但是在你的字符串中
@"A little suffering is good for the soul.\n\t\t-- Kirk, \"The Corbomite Maneuver\", stardate 1514.0\n%\nA man either lives life as it happens to him, meets it head-on and\nlicks it, or he turns his back on it and starts to wither away.\n\t\t-- Dr. Boyce, \"The Menagerie\" (\"The Cage\"), stardate unknown\n%"
签署%
不是百分号。在Objective-C中,百分号被声明为%
标记
@"%%"