2012-07-18 85 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())! 
相關問題