如何从包含空格的字符串创建 NSURL?

Posted

技术标签:

【中文标题】如何从包含空格的字符串创建 NSURL?【英文标题】:How do you create an NSURL from a string containing spaces? 【发布时间】:2012-07-18 19:42:17 【问题描述】:

这段代码的结果是url为空

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];

【问题讨论】:

【参考方案1】:

您的问题不是从包含空格的 string 中创建 URL,而是从包含空格的 path string 中创建 URL。

对于路径,您不应使用URLWithString。 Mac OS X 和 ios 包含用于为文件路径构建 NSURL 的便利功能,这些功能可以自动为您处理这些以及更多。请改用其中之一。

Apple 的 [NSURL fileURLWithPath: path] 文档说:

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

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

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

把这些放在一起,你会得到这样的结果:

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

来源:

iOS Developer Library: NSURL Class Reference

【讨论】:

【参考方案2】:

您实际上需要添加百分比转义,而不是删除它们:

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

【讨论】:

【参考方案3】:

Swift 2.0 版本:

let encodedPath = path?.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet())!

【讨论】:

【参考方案4】:

首先,如果您实际上是在尝试获取应用程序的应用程序支持目录,请使用适合该工作的方法(在本例中为 NSFileManager)并直接处理 URL:

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

如果你真的想建立一个路径,那么使用适当的初始化器,在这种情况下,告诉 URL 它是一个文件路径 URL,这样它就会自然地处理空格,你可能可以建立 URL 路径(这个示例更像您上面的代码):

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

现在,URL 将被正确地进行百分比编码,您不会有任何问题(返回时不会为 nil)。

【讨论】:

如果通过 URLForDirectory: 创建的 URL 被输入到 NSFileManger:enumeratorAtPath: (在首先使用 absoluteString 将其转换为字符串之后),则返回的 NSDirectoryEnumerator 为空。我最初将 URLForDirectory 与 enumeratorAtURL: 结合使用:但无法使用我正在做的事情,因此切换到 enumeratorAtPath,但这似乎不适用于 URLForDirectory。见***.com/questions/11546974/… @ChrisP.Bacon 同样,这是使用正确 API 的问题。如果您有文件 URL,则不应通过调用 -absoluteString 将其转换为路径,而应通过调用 -path 方法将其转换为路径。

以上是关于如何从包含空格的字符串创建 NSURL?的主要内容,如果未能解决你的问题,请参考以下文章

带空格的字符串无法转换为 NSURL - Mantle

如何使用 scanf 从用户输入中获取字符串( char * ),由双引号分隔并包含空格 [关闭]

如何在 NSURL 中使用特殊字符?

如何在序列化之前从 DOM 中去除仅包含空格的文本节点?

如何从 Postgres 中的字符串中删除 '\t'、'\n' 或多余的空格?

如何检查字符串是不是包含字符和空格,而不仅仅是空格?