Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c NSString writeToFile带有URL编码字符串_Objective C_Cocoa_Macos_Nsstring - Fatal编程技术网

Objective c NSString writeToFile带有URL编码字符串

Objective c NSString writeToFile带有URL编码字符串,objective-c,cocoa,macos,nsstring,Objective C,Cocoa,Macos,Nsstring,我有一个Mac应用程序,它保存自己的日志文件。它使用NSString的writeToFile方法将信息附加到文件中。它记录的内容之一是与之交互的web服务的URL。要对URL进行编码,我将执行以下操作: searchString = (NSString *)CFURLCreateStringByAddingPercentEscapes(NULL, (CFStringRef)searchString, NULL, (CFStringRef)@"!*'();:@&=+$,/?%#[]", k

我有一个Mac应用程序,它保存自己的日志文件。它使用NSString的writeToFile方法将信息附加到文件中。它记录的内容之一是与之交互的web服务的URL。要对URL进行编码,我将执行以下操作:

searchString = (NSString *)CFURLCreateStringByAddingPercentEscapes(NULL, (CFStringRef)searchString, NULL, (CFStringRef)@"!*'();:@&=+$,/?%#[]", kCFStringEncodingUTF8 );
然后,应用程序将searchString附加到URL的其余部分,并将其写入日志文件。现在的问题是,在添加URL编码行之后,似乎没有任何内容写入文件。但是,该程序的功能与预期相同。删除上面的代码行会将所有正确的信息记录到文件中(删除该行不是一个选项,因为searchString必须是URL编码的)

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

谢谢你的帮助

编辑:我知道还有一个类似于CFURLCreateStringByAddingPercentEscapes的函数在NSString中,但我听说它并不总是有效的。如果我最初的问题无法得到回答,有人能解释一下吗?谢谢(编辑:使用
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];
}

因为在几乎一整天都没有人给出任何答案之后,我将在这里发布一个猜测:您不是无意中使用了要输出的字符串(其中包含%字符)作为格式字符串,是吗

也就是说,犯了这样的错误:

NSLog(@“格式字符串,您可以使用%@作为对象的占位符,%i作为普通C整数。”)

而不是:

NSLog(@“%@”,“@”格式字符串,您可以将%@用作对象的占位符,将%i用作普通C整数。“)

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

所以,如果这个答案不起作用,就不要击倒我。如果您能向我们展示更多的日志代码,那么回答您的问题会更容易。至于你提供的那一行,我看不出有什么问题

Edit:Oops,我有点错过了您提到的您正在使用
writeToFile:atomicaly:encoding:error:
将字符串写入文件,因此您更不可能意外地将其视为某个格式字符串。但我现在不打算回答这个问题。同样,您应该向我们展示更多的代码


编辑:关于您对NSString中具有类似百分比编码功能的方法的问题,该方法将是
stringByAddingPercentEscapesUsingEncoding:
。我不知道当你说你听说它不总是起作用时,你在想什么样的问题。但有一点是,
cfurlcreateStringByAddingPercentescape
允许您指定通常不必转义但仍希望转义的额外字符,而NSString的方法不允许您指定此项。

我将尝试
stringByAddingPercentEscapesUsingEncoding:
并查看它是否会导致任何问题。使用
stringByAddingPercentEscapesUsingEncoding:
似乎也不会导致任何内容记录到文件中。我将在我的原始帖子中添加更多的代码。旁白:奇怪的是,你读写文件的全部内容只是为了在末尾附加一个字符串。至于您的问题,我仍然没有找到您的代码在没有
stringByAddingPercentEscapesUsingEncoding:
转换的情况下工作的原因,但如果您添加它,则不会。您是否能够将这个问题复制为一个小的SenTestingKit单元测试,您可以发布在这里(它不依赖于您自己的任何代码,因此其他人可以尝试它;也许可以使用一个单独的新Xcode项目)?是的,我在Cocoa的早期编写了该代码,也许我应该做一些更改。我只是试着做一个测试项目,一切都如期进行。我无法想象我的代码的哪一部分会导致这种情况。有没有可能是记录的实际文本导致了问题?我担心,除非你能在这里发布足够的代码或其他指令,让其他人在他们自己的机器上重现问题,否则这会将太多的内容转化为远程调试会话,而这不是本网站的目的。在这一点上,我只能提供一般性的建议:使用Xcode调试工具,或者在代码中添加一些
NSLog
。正如您所说,代码在没有编码URL行的情况下工作,我会在这之后放置一个断点或
NSLog(@“Encoded:%@”,searchString)
,可能
NSLog(@“Logging:%@”,theString)
logText:
的开头,我发现了问题。这与我将NSString写入文件的方式有关。我使用的是NSString的
writeToFile:
,但我切换到了NSFileHandle,现在一切似乎都很好。