2012-07-18 80 views
2

这段代码的结果是,网址为空如何从包含空格的字符串创建NSURL?

NSString* home = [NSHomeDirectory() stringByAppendingPathComponent:@"/Library/Application Support/"]; 
NSURL *url = [NSURL URLWithString:home]; 

,所以是这样的:

NSString* home = [NSHomeDirectory() stringByAppendingPathComponent:@"/Library/Application Support/"]; 
home = [home stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 
NSURL *url = [NSURL URLWithString:home]; 

回答

10

你的问题不是关于从字符串包含空格,但从包含空格的路径字符串创建一个URL。

对于路径,您不应该使用URLWithString。 Mac OS X和iOS包括便捷功能,用于为处理此操作的文件路径构建NSURL,并自动为您提供更多帮助。改为使用其中之一。

苹果的[NSURL fileURLWithPath: path]文件说:

这种方法假定路径是一个目录,如果它以斜线结束。如果路径不以斜线结尾,则该方法检查文件系统以确定路径是文件还是目录。如果路径存在于文件系统中并且是一个目录,则该方法追加一个尾部斜杠。如果路径在文件系统中不存在,则该方法假定它代表一个文件并且不附加尾部斜线。

作为替代方案,请考虑使用fileURLWithPath:isDirectory:,它允许您明确指定返回的NSURL对象是否代表文件或目录。

此外,您应该使用NSSearchPathForDirectoriesInDomains来查找应用程序支持目录。

把所有这些组合起来,你想最终是这样的:

NSArray *paths = NSSearchPathForDirectoriesInDomains(
        NSApplicationSupportDirectory, NSUserDomainMask, YES); 
NSString *applicationSupportDirectory = [paths objectAtIndex:0]; 
NSURL *url = [NSURL fileURLWithPath: applicationSupportDirectory isDirectory: YES]; 

来源:

4

你实际上需要添加百分号转义,而不是将其删除:

NSString* home = [NSHomeDirectory() stringByAppendingPathComponent:@"/Library/Application Support/"]; 
    NSURL *url = [NSURL URLWithString:[home stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; 
    NSLog(@"%@", url); 

打印:

2012-07-18 13:44:54.738 Test[1456:907] /var/mobile/Applications/FF6E6881-1D1B-4B74-88DF-06A2B62CCFE6/Library/Application%20Support 
1

首先,如果你实际上是试图为您的应用程序获取应用程序支持目录,为作业使用适当的方法(在这种情况下,在NSFileManager)并使用URL可怕ctly:

NSURL* appSupport = [[NSFileManager defaultManager] URLForDirectory: NSApplicationSupportDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:YES error:NULL]; 

如果你真的想建立一个路径,然后使用适当的初始化,在这种情况下,说,这是一个文件路径URL,这样自然会处理空间的网址,你或许可以建立向上的URL路径(这个例子更像是你的代码段):

NSString* home = [NSHomeDirectory() stringByAppendingPathComponent:@"/Library/Application Support/"]; 
// Here, use the appropriate initializer for NSURL 
NSURL *url = [NSURL fileURLWithPath:home]; 

现在,URL将是正确%的编码,你不会有任何问题(返回时,它不会是零)。

+0

经由如果创建URLForDirectory的URL:被送入NSFileManger:enumeratorAtPath:(第一后其转换为使用absoluteString字符串),然后返回NSDirectoryEnumerator是空的。我最初使用URLForDirectory与enumeratorAtURL结合使用:但无法使用我所做的操作切换到enumeratorAtPath,但这似乎不适用于URLForDirectory。请参阅http://stackoverflow.com/questions/11546974/nsfilemanagerenumeratoraturl-returns-a-different-form-of-url-to-nsfilemanager – Gruntcakes 2012-07-18 20:55:03

+0

@ ChrisP.Bacon同样,这是使用正确API的问题。如果你有一个文件的URL,你不应该通过调用'-absoluteString'将它转换为路径,你应该*通过调用'-path'方法将它转换为路径。 – 2012-07-18 21:15:45

4

夫特2.0版:

let encodedPath = path?.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet())! 
相关问题