Как декодировать URL в iOS - Цель C - PullRequest
29 голосов
/ 27 октября 2011

Метод stringByReplacingPercentEscapesUsingEncoding работает неправильно, так как он не декодирует специальные символы, которые не начинаются с символа%, то есть символа +. Кто-нибудь знает лучший способ сделать это в iOS?

Вот что я сейчас использую:

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

А вот пример вывода:

путь + с + пробелами

Ответы [ 5 ]

51 голосов
/ 27 октября 2011
NSString *path = [[@"path+with+spaces"
    stringByReplacingOccurrencesOfString:@"+" withString:@" "]
    stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

Обратите внимание, что подстановка "плюс-на-пробел" используется только в application/x-www-form-urlencoded данных - части URL-адреса строки запроса или теле запроса POST.

20 голосов
/ 21 мая 2012
// 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

Кажется, что это предпочтительный способ, потому что ... "Судя по всему", это "ошибка", яблоко знает, но они еще ничего не сделали... (http://simonwoodside.com/weblog/2009/4/22/how_to_really_url_encode/)

2 голосов
/ 27 октября 2011

Если вы пытаетесь заменить знак плюс на экранирование в процентах, выполните замену строки с "+" на "" (один пробел). Затем используйте stringByAddingPercentEscapesUsingEncoding:, чтобы добавить процентный выход.

Знак плюс является одним из многих зарезервированных символов URL, который никогда не кодируется.

(stringByReplacingPercentEscapesUsingEncoding: расшифровывает процент побега)

1 голос
/ 30 января 2016

Свифт 2:

extension String  {

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

}
0 голосов
/ 07 июля 2018

Также вы можете использовать библиотеку PercentEncoder от Cocoapods.

Swift 4

  • Включить библиотеку в ваш Podfile:

    pod PercentEncoder

  • Импорт библиотеки PercentEncoder

    импорт PercentEncoder

    класс ViewController {

    ...

    }

  • Замените символ "+" на "% 20" и используйте метод "ped_decodeURI"

    "path + с +пробелы ".replacingOccurferences (из:" + ", с:"% 20 "). ped_decodeURI ()

Возвращает" путь с пробелами "

Здесьссылка для справки: https://cocoapods.org/pods/PercentEncoder

...