【问题标题】:NSString writeToFile with URL encoded string带有 URL 编码字符串的 NSString writeToFile
【发布时间】:2011-07-26 12:48:06
【问题描述】:

我有一个保留它自己的日志文件的 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];
}

【问题讨论】:

  • 旁注:很奇怪,您读取和写入文件的全部内容只是为了在末尾附加一个字符串。至于您的问题,我仍然没有检测到您的代码在没有stringByAddingPercentEscapesUsingEncoding: 转换的情况下工作的原因,但如果您添加它就不行。您是否能够将问题重现为可以在此处发布的小型 SenTestingKit 单元测试(并且不依赖于您自己的任何代码,因此其他人可以尝试;也许使用单独的新 Xcode 项目)?
  • 是的,我在 Cocoa 的早期编写了该代码,也许我应该做一些更改。我只是尝试制作一个测试项目,一切都按预期工作。我无法想象我的代码的哪一部分会导致这种情况。正在记录的实际文本是否可能导致问题?
  • 恐怕除非您可以在此处发布足够多的代码或其他说明,以便其他人在他们自己的机器上重现该问题,否则这将过多地变成远程调试会话,这是这不是本网站的目的。在这一点上,我只能为您提供一般性建议:使用 Xcode 调试工具,或在您的代码中添加一些 NSLog。正如你所说的代码在没有编码 URL 行的情况下工作,我会在之后放置一个断点或 NSLog(@"Encoded: %@", searchString),也许 NSLog(@"Logging: %@", theString)logText: 的开头。
  • 我发现了问题。这与我将 NSString 写入文件的方式有关。我使用的是 NSString 的 writeToFile:,但我切换到 NSFileHandle,现在一切正常。

标签: objective-c cocoa macos nsstring


【解决方案1】:

因为几乎一整天都没有其他人提供任何答案,所以我将在这里发布一个疯狂的猜测:您不会不小心将要输出的字符串(其中包含百分比字符)用作 格式字符串你呢?

也就是做错了:

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 的方法不允许您指定这一点。

【讨论】:

  • 我会尝试stringByAddingPercentEscapesUsingEncoding: 看看是否会导致任何问题。
  • 看来使用stringByAddingPercentEscapesUsingEncoding: 也不会导致没有任何内容被记录到文件中。我将在我的原始帖子中添加更多代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-04
  • 1970-01-01
  • 2015-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多