Подтвердить что ты не робот

Как декодировать URL в iOS - Цель C

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

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

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

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

Путь + с + пространств

4b9b3361

Ответ 1

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

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

Ответ 2

// 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/)

Ответ 3

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

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

(stringByReplacingPercentEscapesUsingEncoding: декодирует проценты экранов)

Ответ 4

swift 2:

extension String  {

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

}