2011-10-27 21 views
29

Metoda stringByReplacingPercentEscapesUsingEncoding nie działa poprawnie, ponieważ nie dekoduje specjalnych symboli, które nie zaczynają się od znaku%, tj. Znaku +. Czy ktoś wie lepszej metody to zrobić w iOS?Jak odszyfrować URL w iOS - Cel C

Oto co obecnie używam:

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

A oto przykład wyjścia:

ścieżce + z + przestrzeniach

+3

Czy możesz zamieścić swój kod lub przykład, gdzie i jak ta metoda nie działa prawidłowo dla Ciebie? – Carter

+0

właśnie, dzięki. – VinnyD

+0

+ jest prawidłowym znakiem URL. – titaniumdecoy

Odpowiedz

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

Należy zauważyć, że plus do-miejsca podstawienia używać application/x-www-form-urlencoded danych - część ciągu zapytania URL lub korpus żądania POST.

+2

są jeszcze inne znaki, które + muszą zostać zdekodowane, nie? – VinnyD

+0

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

+0

Kiedy próbowałem rozszyfrować ciąg @ "abcjhjhdfjhafjakhfjaklfj12346890 (*^$ # @@@ # $% ^^ ........ ", używając tej metody, zwraca zero, wygląda na to, że stringByReplacingPercentEscapesUsingEncoding powoduje pewne problemy z powodu" Zwraca zero, jeśli transformacja nie jest możliwa (np. procentowe wartości powodują, że sekwencja bajtów nie jest legalna w podanym kodowaniu). "(od NSURL.h). Tak więc po prostu heads-up dla tych, którzy napotkali ten problem, tworząc kategorię podobną do mnie: –

1

Jeśli próbujesz zastąpić znak plus z procent ucieczek, wykonaj zamianę łańcuchów z "+" na "" (pojedyncza spacja). Następnie użyj stringByAddingPercentEscapesUsingEncoding:, aby dodać procentowe znaki ucieczki.

Znak plus jest jednym z wielu zarezerwowanych znaków URL, które nigdy nie są kodowane.

(stringByReplacingPercentEscapesUsingEncoding: dekoduje ucieczki procent)

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

To wydaje się być najlepszym sposobem, ponieważ ... „Podobno” to „błąd” Apple jest świadomy, ale nie zostały one nic o tym jeszcze zrobić .. . (http://simonwoodside.com/weblog/2009/4/22/how_to_really_url_encode/)

+0

Idealnie! Zdrowie przyjacielu! – Marcelo

1

Swift 2:

extension String { 

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

}