2014-11-25 5 views
0

У меня есть URL-адрес, который содержит специальные символы (% используется очень много). Я хочу кодировать URL-адрес, как? это один пример моих моих URL-адресов: http://some.com//en/it/name-50%-other-set-50%-/68Кодировать URL-адрес содержит специальные символы

Я попытался следующие:

// Option - 1. 

NSString* str = [self.shareURL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 

// Option - 2. 

NSString *unsafeString = @"this &string= confuses ? the InTeRwEbZ"; 
CFStringRef safeString = CFURLCreateStringByAddingPercentEscapes (
    NULL, 
    (CFStringRef)unsafeString, 
    NULL, 
    CFSTR("/%&=?$#[email protected]<>|\\*,.()[]{}^!"), 
    kCFStringEncodingUTF8 
); 

// Option - 3. 

NSString *escapedString = [unescaped stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLHostAllowedCharacterSet]]; 

ответ

0

, как вы сказали, http://some.com//en/it/name-50%-other-set-50%-/68 плохой URL. Какой у вас хороший URL-адрес?

И почему существует // после .com?

+0

Да .. вы правы, я не знаю, как я этого не делал раньше, thanx – user2168496

+0

Добро пожаловать :) Счастливое кодирование – Atomnium

0

Отбор ваши три варианта в следующем порядке:

  1. Использование stringByAddingPercentEscapesUsingEncoding удобно и позволит решить вашу проблему URL с % в нем.

    Однако этот метод весьма ограничен и не решает многие проблемы с общим процентом. Что, если, например, ваша любопытная строка пути URL-адреса содержит ?? Этот метод позволил бы избежать появления вопросительного знака (поскольку знак вопроса действителен в URL-адресах как способ ограничения начальных параметров запроса), что было бы проблемой в этом случае, если бы вам действительно нужен ? как часть этого пути.

    На практике, хотя люди любят предлагать stringByAddingPercentEscapesUsingEncoding в качестве ответа на процентные вопросы, связанные с процентом, он неизменно не обеспечивает достаточного контроля для адекватной работы.

  2. Это приводит нас к CFURLCreateStringByAddingPercentEscapes, который является функцией Core Foundation, которая обеспечивает более высокий уровень контроля. До iOS 7 это было решение «идти», позволяющее вам квалифицировать, какие «юридические символы» вы, возможно, захотите дополнительно избежать (например, ? в моем предыдущем примере). Вы также можете указать, какие символы, как правило, экранированы, что вы можете оставить без сохранения.

    Три наблюдения на вашем примере этой функции, хотя:

    • Вы определили большой набор символов, которые будут бежать, в том числе несколько, которые бы убежали в любом случае. Не стоит включать эти дополнительные символы, но предлагает небольшое недоразумение о том, что делает эта функция.

    • Кроме того, вы избежать некоторых символов (., - и ~), которые не нуждаются в побеге.

    • Наконец, когда мы используем эту функцию в нашем коде Objective-C, мы обычно возвращает его в качестве NSString и передачи права собственности с CFBridgingRelease или __bridge_transfer. Это избавляет нас от необходимости иметь дело с типами Core Foundation и иметь вручную CFRelease.

    Во всяком случае, это дает что-то вроде:

    - (NSString *)percentEscapeString:(NSString *)string 
    { 
        return CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, 
                        (CFStringRef)string, 
                        NULL, 
                        (CFStringRef)@":/[email protected]!$&'()*+,;=", 
                        kCFStringEncodingUTF8)); 
    } 
    

    Кстати, если вы сделаете это своего рода рутина процента побега, сделать это на отдельные компоненты URL (например, только ту часть путь с «50%» в названии), а не весь URL.Есть символы, которые действительны в URL-адресе (например, или :), но не будут действительны в этом пути, поэтому вы хотите, чтобы процентные символы были исключены из этих символов в пути, но не в URL-адресе в целом.

  3. Это приводит нас к stringByAddingPercentEncodingWithAllowedCharacters. Этот метод, введенный в iOS 7, обеспечивает тот же уровень управления, что и вышеупомянутая функция Core Foundation, но без проблем с мостом. Просто выберите подходящий набор символов, и он будет идти оттуда.

Смежные вопросы