Использование stringByAddingPercentEscapesUsingEncoding
удобно и позволит решить вашу проблему URL с %
в нем.
Однако этот метод весьма ограничен и не решает многие проблемы с общим процентом. Что, если, например, ваша любопытная строка пути URL-адреса содержит ?
? Этот метод позволил бы избежать появления вопросительного знака (поскольку знак вопроса действителен в URL-адресах как способ ограничения начальных параметров запроса), что было бы проблемой в этом случае, если бы вам действительно нужен ?
как часть этого пути.
На практике, хотя люди любят предлагать stringByAddingPercentEscapesUsingEncoding
в качестве ответа на процентные вопросы, связанные с процентом, он неизменно не обеспечивает достаточного контроля для адекватной работы.
Это приводит нас к 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-адресе в целом.
Да .. вы правы, я не знаю, как я этого не делал раньше, thanx – user2168496
Добро пожаловать :) Счастливое кодирование – Atomnium