2011-10-27 14 views
29

Il metodo stringByReplacingPercentEscapesUsingEncoding non funziona correttamente in quanto non decodifica simboli speciali che non iniziano con un carattere%, cioè il carattere +. Qualcuno sa di un metodo migliore per farlo in iOS?Come decodificare l'URL in iOS - Obiettivo C

Ecco quello che sto attualmente in uso:

NSString *path = [@"path+with+spaces" 
    stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 

Ed ecco un esempio di output:

percorso + con + spazi

+3

Potete per favore pubblicare il tuo codice o un esempio di dove e come il metodo che non funziona correttamente per voi? – Carter

+0

ha appena fatto, grazie. – VinnyD

+0

+ è un carattere URL valido. – titaniumdecoy

risposta

51
NSString *path = [[@"path+with+spaces" 
    stringByReplacingOccurrencesOfString:@"+" withString:@" "] 
    stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 

Si noti che la sostituzione plus-per-spazio è utilizzato solo nei dati application/x-www-form-urlencoded - la parte stringa di query di un URL, o il corpo di una richiesta POST.

+2

ci sono altri caratteri oltre che i + che devono essere decodificati, no? – VinnyD

+0

n. Http://www.w3.org/TR/html4/interact/forms.html#h-17.13.4.1 –

+0

Quando ho provato a decodificare una stringa @ "abcjhjhdfjhafjakhfjaklfj12346890 (*^$ # @@@ # $% ^^ ........ ", usando questo metodo, restituisce nil. Sembra che stringByReplacingPercentEscapesUsingEncoding stia causando alcuni problemi a causa di" Restituisce nil se la trasformazione non è possibile (cioè la percentuale di escape fornisce una sequenza di byte non legale nella codifica fornita). "(da NSURL.h). Quindi, solo un testa a testa per coloro che si sono imbattuti in questo problema facendo una categoria come me. –

1

Se si sta tentando di sostituire il segno più con percentuale di escape, eseguire una sostituzione di stringa da "+" a "" (spazio singolo). Quindi utilizzare stringByAddingPercentEscapesUsingEncoding: per aggiungere gli escape percentuali.

Il segno più è uno dei molti caratteri URL riservati che non viene mai codificato.

(stringByReplacingPercentEscapesUsingEncoding: decodifica le uscite per cento)

20
// Decode a percent escape encoded string. 
- (NSString*) decodeFromPercentEscapeString:(NSString *) string { 
return (__bridge NSString *) CFURLCreateStringByReplacingPercentEscapesUsingEncoding(NULL, 
                 (__bridge CFStringRef) string, 
                 CFSTR(""), 
                 kCFStringEncodingUTF8); 
} 

http://cybersam.com/ios-dev/proper-url-percent-encoding-in-ios

Questo sembra essere il modo migliore perché ... "Apparentemente" questo è una mela "bug" è a conoscenza, ma non hanno ancora fatto nulla al riguardo .. . (http://simonwoodside.com/weblog/2009/4/22/how_to_really_url_encode/)

+0

Perfetto! Acclamazione amico! – Marcelo

1

rapida 2:

extension String { 

    func uriDecodedString() -> String? { 
     return self.stringByReplacingOccurrencesOfString("+", withString: " ").stringByRemovingPercentEncoding 
    } 

}