带有URL编码字符串的NSString writeToFile

时间:2011-03-31 00:41:16

标签: objective-c cocoa macos nsstring

我有一个Mac应用程序,它保留了自己的日志文件。它使用NSString的writeToFile方法将信息附加到文件中。它记录的一件事是它正在与之交互的Web服务的URL。要对URL进行编码,我这样做:

searchString = (NSString *)CFURLCreateStringByAddingPercentEscapes(NULL, (CFStringRef)searchString, NULL, (CFStringRef)@"!*'();:@&=+$,/?%#[]", kCFStringEncodingUTF8 );

然后,应用程序将searchString附加到URL的其余部分并将其写入日志文件。现在的问题是,添加该URL编码行后,似乎没有任何内容写入该文件。然而,该程序按预期运行。删除上面的代码行会导致所有正确的信息都记录到文件中(删除该行不是一个选项,因为searchString必须是URL编码的。)

哦,我在将NSString写入文件时使用的是NSUTF8StringEncoding。

感谢您的帮助。

编辑:我知道NSString中的CFURLCreateStringByAddingPercentEscapes也有类似的功能,但我读过它并不总是有效。如果我的原始问题无法解答,有人可以对此有所了解吗?谢谢! (编辑:使用stringByAddingPercentEscapesUsingEncoding:

时会出现同样的问题

编辑2:这是我用来将消息附加到日志文件的代码。

+(void)logText:(NSString *)theString{
    NSString *docsDirectory = [NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory,NSUserDomainMask,YES) objectAtIndex:0];
    NSString *path = [docsDirectory stringByAppendingPathComponent:@"Folder/File.log"];
    NSString *fileContents = [[[NSString alloc] initWithContentsOfFile:path] autorelease];
    if([fileContents lengthOfBytesUsingEncoding:NSUTF8StringEncoding] >= 204800){
        fileContents = @"";
    }
    NSString *timeStamp = [[NSDate date] description];
    timeStamp = [timeStamp stringByAppendingString:@": "];
    timeStamp = [timeStamp stringByAppendingString:theString];
    fileContents = [fileContents stringByAppendingString:timeStamp];
    fileContents = [fileContents stringByAppendingString:@"\n"];
    [fileContents writeToFile:path atomically:YES encoding:NSUTF8StringEncoding error:NULL];
}

1 个答案:

答案 0 :(得分:1)

因为在差不多一整天之后没有人提供任何答案,我将在这里发布一个疯狂的猜测:你不会意外地使用你想要输出的字符串(其中包含百分比字符)作为< em>格式字符串是吗?

那就是做错了:

NSLog(@"In format strings you can use %@ as a placeholder for an object, and %i for a plain C integer.")

而不是:

NSLog(@"%@", @"In format strings you can use %@ as a placeholder for an object, and %i for a plain C integer.");

但如果事实证明这是问题的原因,我会感到惊讶,因为它通常会导致随机输出,而不是绝对没有输出。在某些情况下,Xcode还会给出编译器警告(当我尝试NSLog(myString)时,我得到了“警告:格式化不是字符串文字,没有格式参数”)。

所以如果这个答案没有帮助的话,不要把我击倒。如果您可以向我们展示更多您的日志记录代码,那么回答您的问题会更容易。至于你提供的那一行,我无法发现任何错误。

编辑:哎呀,我有点想念你提到你正在使用writeToFile:atomically:encoding:error:将字符串写入文件中,所以你不太可能将它意外地视为文件某处的格式字符串。但是我现在要留下这个答案了。同样,你应该向我们展示更多你的代码......

编辑:关于NSString中具有类似百分比编码功能的方法的问题,即stringByAddingPercentEscapesUsingEncoding:。当你说你听说它并不总是奏效时,我不确定你在想什么样的问题。但有一点是CFURLCreateStringByAddingPercentEscapes允许您指定通常不必转义但仍希望转义的额外字符,而NSString的方法不允许您指定它。