2013-03-27 18 views
17

Ho provato un sacco di approcci là fuori, ma questa piccola stringa non può essere decodificata URL.Decodifica URL NSString?

NSString *decoded; 
NSString *encoded = @"fields=ID%2CdeviceToken"; 
decoded = (__bridge NSString*)CFURLCreateStringByReplacingPercentEscapesUsingEncoding(NULL, (CFStringRef)encoded, NULL, NSUTF8StringEncoding); 
NSLog(@"decodedString %@", decoded); 

Il codice sopra registra la stessa stringa (!) Dopo la sostituzione delle percentuali di escape.

Esiste una soluzione affidabile? Penso che un qualche tipo di soluzione RegEx basata su qualche documentazione possa funzionare. Qualche suggerimento?

+0

per SWIFT let decodificato = codificato! .stringByReplacingPercentEs capesUsingEncoding (NSUTF8StringEncoding); – johndpope

risposta

17

Utilizzare CFSTR("") anziché NULL per il penultimo argomento. Dalle CFURL reference:

charactersToLeaveEscaped

personaggi la cui fuga per cento sequenze, come ad esempio% 20 per un carattere di spazio, si vuole lasciare intatto. Passare NULL per specificare che nessuna percentuale di escape deve essere sostituita o la stringa vuota (CFSTR ("")) per specificare che tutti devono essere sostituiti.

NSString *encoded = @"fields=ID%2CdeviceToken"; 
    NSString *decoded = (__bridge_transfer NSString *)CFURLCreateStringByReplacingPercentEscapesUsingEncoding(NULL, (CFStringRef)encoded, CFSTR(""), kCFStringEncodingUTF8); 
    NSLog(@"decodedString %@", decoded); 

stampe:

2013-03-26 21: 48: 52,559 URLDecoding [28794: 303] decodedString campi = ID, deviceToken

+0

Esattamente, grazie. – Geri

+0

@Carl Quando provo il tuo codice stampa 'Decoded String: (null) ' nella console. Ho trovato il motivo. Invece di 'NSUTF8StringEncoding', ho usato 'kCFStringEncodingUTF8' e funziona. – Geek

+0

@Geek grazie per averlo capito! –

33

Un'altra alternativa sarebbe be:

NSString *decoded = [encoded stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 
+3

Ho ancora delle percentuali nelle mie, dopo averlo fatto per esempio. http% 3A% 2F% 2Fwebsite.com – Alioo

+0

cosa per ios 6.0? – BergP

+0

Questo approccio dovrebbe funzionare per iOS2.0 + –

11

CFURLCreateStringByReplacingPercentEscapesUsingEncoding è deprecato in iOS 9. Utilizzare stringByRemovingPercentEncoding invece.

NSString *decoded = [encoded stringByRemovingPercentEncoding]; 
1

Swift 3

import Foundation 

let charSet = CharacterSet.urlPathAllowed.union(.urlQueryAllowed) // just use what you need, either path or query 
let enc = "Test Test Test".addingPercentEncoding(withAllowedCharacters: charSet)! 
let dec = enc.removingPercentEncoding! 

print("Encoded: \(enc)") 
print("Decoded: \(dec)") 

uscita:

codificati: Prova% 20Test% 20Test

Decoded: Test Test Test