2010-04-07 49 views
12

我正在嘗試URL編碼一個字符串以形成來自objective-c的GET請求。URLEncoding一個字符串與Objective-C

NSString *params = @"'Decoded data!'/foo.bar:baz"; 

NSRunAlertPanel(@"Error", [params urlEncoded], @"OK", nil, nil); 

這是擴展的NSString

-(NSString *) urlEncoded 
{ 
    NSString *encoded = (NSString *)CFURLCreateStringByAddingPercentEscapes(
                NULL, 
                (CFStringRef)self, 
                NULL, 
                (CFStringRef)@"!*'\"();:@&=+$,/?%#[]% ", 
                kCFStringEncodingUTF8); 
    return encoded; 
} 

類別所以我第一次運行它,我回來

1606410046ecoded   1606410784ata2270.000000foo.bar0X1.001716P-1042baz 

從該對話框。

緊接着我再次運行它,我得到這個

1606410046ecoded   1606410944ata227369374562920703448982951250259562309742470533728899744288431318481119278377104028261651081181287077973859930826299575521579020410425419424562236383226511593137467590082636817579938932512039895040.000000foo.bar0X1.66E6156303225P+771baz 

然後,如果我跑一遍,又回到第一個。這真的很奇怪。

如果參數設置爲@「&」或@「」我只是在對話框中取回「2」(無引號)。

也有一種方法,我可以在警告對話框中顯示%符號嗎?

感謝

+1

你爲什麼叫它兩次,爲什麼你不記錄你的輸出而不是將它放到警報中? – 2010-04-07 07:34:24

回答

23

我覺得NSAlert被解釋%字符字符串格式說明這是充滿隨機數據。只是NSLog輸出和它的罰款:

%27Decoded%20data%21%27%2Ffoo.bar%3Abaz 

此外,你必須在你的-urlEncoded類方法的內存泄漏。您使用包含Create的CF函數創建字符串,因此您有責任釋放它。

-(NSString *) urlEncoded 
{ 
    CFStringRef urlString = CFURLCreateStringByAddingPercentEscapes(
                NULL, 
                (CFStringRef)self, 
                NULL, 
                (CFStringRef)@"!*'\"();:@&=+$,/?%#[]% ", 
                kCFStringEncodingUTF8); 
    return [(NSString *)urlString autorelease]; 
} 
+0

感謝內存泄漏警告。實際上,NSLog也存在問題。我通過在下面的響應中詳細說明的字符串中用%%替換%來修復它。 – Chris 2010-04-07 19:41:38

+3

這意味着你可能使用'NSLog'就像這樣:'NSLog(encoded)'。 「NSLog」的第一個參數是一個格式字符串,而不是一個純字符串。任何字符串格式的佔位符將被替換爲後面的參數,在這種情況下,它們是未定義的。你必須像這樣記錄字符串:'NSLog(@「%@」,編碼);'。 – 2010-04-08 00:49:58

+1

使用'return [NSMakeCollectable(urlString)autorelease];'也使GC清潔,並避免了劇組。 – 2011-10-18 00:22:03

1

好的結果是這是一個不公開的。它正在被正確編碼,因爲我檢查了服務器日誌,看起來請求參數被編碼了。

並且爲了正確顯示對話框中的編碼字符串,我在事實之後用%%替換了%的所有實例。

6

我已經開源了我的URL編碼器工具類,它智能地跳過URL的域和路徑部分(避免編碼斜槓等),並且只轉義未遵循2-數字十六進制代碼(防止像這樣的百分數的雙重編碼:%20 - >%2520)。

它已經通過超過10,000個網址進行了測試,並且非常強大和高性能。

你可以在這裏瞭解更多關於(和下載)我的實施... http://jayfuerstenberg.com/devblog/url-encoding-in-objective-c

2

而不是自動釋放,使用ARC時不再可用,通過傳遞一個字符串,並使用CFBridgingRelease創建實例方法:

- (NSString *)urlEncodeWithString: (NSString*)string 
{ 
    CFStringRef urlString = CFURLCreateStringByAddingPercentEscapes(
                    NULL, 
                    (CFStringRef)string, 
                    NULL, 
                    (CFStringRef)@"!*'\"();:@&=+$,/?%#[]% ", 
                    kCFStringEncodingUTF8); 
    return (NSString *)CFBridgingRelease(urlString); 
} 
0

在我看來,最簡單的方法是使用提供方便的方法與NSString (NSURLUtilities)類別

我的實現:

- (NSString *) urlEncodedString 
{ 
    NSString *result = [self stringByReplacingOccurrencesOfString:@" " withString:@"+"]; 
    result = [result stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 
    return result; 
} 
+0

不起作用。翻譯「這是我的+聲明,明白了嗎?」 「This + is + my +++ statement。+ Got + it?」而不是「This + is + my +%2B + statement。+ Got + it%3F」。 – Volomike 2016-07-15 06:57:05