[NSURL URLWithString: stringContainedSpecialCharacters] - PullRequest
2 голосов
/ 25 января 2011

Скажем, у меня есть адресная строка UITextField с именем textField и UIWebView с именем webView.В большинстве случаев работает следующий код:

[webView loadURL:[NSURL URLWithString:textField.text]];

Когда я добавляю длинную строку со специальными символами, URLWithString: просто возвращает null.Хороший пример - букмарклет Readability:

javascript:(function(){readConvertLinksToFootnotes=true;readStyle='style-newspaper';readSize='size-medium';readMargin='margin-wide';_readability_script=document.createElement('script');_readability_script.type='text/javascript';_readability_script.src='http://lab.arc90.com/experiments/readability/js/readability.js?x='+(Math.random());document.documentElement.appendChild(_readability_script);_readability_css=document.createElement('link');_readability_css.rel='stylesheet';_readability_css.href='http://lab.arc90.com/experiments/readability/css/readability.css';_readability_css.type='text/css';_readability_css.media='all';document.documentElement.appendChild(_readability_css);_readability_print_css=document.createElement('link');_readability_print_css.rel='stylesheet';_readability_print_css.href='http://lab.arc90.com/experiments/readability/css/readability-print.css';_readability_print_css.media='print';_readability_print_css.type='text/css';document.getElementsByTagName('head')[0].appendChild(_readability_print_css);})();

Согласно этому ответу , я могу использовать stringByAddingPercentEscapesUsingEncoding для экранирования строки, и, действительно, он отлично работает в этом случае.

Мой вопрос: Безопасно ли всегда вызывать stringByAddingPercentEscapesUsingEncoding: перед передачей строки в webView?Имеют ли следующие последствия какие-либо последствия?

[webView loadURL:[NSURL URLWithString:[textField.text stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]]

Спасибо!

РЕДАКТИРОВАТЬ. Под словом «безопасный» я подразумеваю, что хотя это работает с URL-адресами, содержащими символы Юникода, оно все ещенормально работают с «обычными» URL-адресами?

РЕДАКТИРОВАТЬ 2: Если это «безопасно», почему это не поведение по умолчанию?

Ответы [ 2 ]

5 голосов
/ 16 марта 2011

Поскольку других ответов на мой вопрос нет, я решил использовать следующий метод - (NSURL *)URLValue вместо - (NSURL *)URLWithString: в качестве безопасной меры:

- (NSURL *)URLValue {
    NSURL *URL = [NSURL URLWithString:self];

    if (URL) return URL;

    return [NSURL URLWithString:[self stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
}
0 голосов
/ 25 января 2011

Нет проблем.Все возвращенные объекты автоматически освобождены, поэтому нет утечек.

...