使用Objective-C中的百分号(%)解析文件

时间:2016-07-22 00:14:09

标签: objective-c text-parsing

我正在为财富文件编写解析器。 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,但它会产生相同的结果。

所以问题是,我如何保留百分号?或者,我可以将它用作分隔符,然后分别解析每个后续结果。

2 个答案:

答案 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中,百分号被声明为%标记

的两倍
@"%%"