NSURL URLWithString: имеет значение null с неанглийскими символами с диакритическими знаками

У меня есть следующая строка ...

NSString *googleSearchString = @"http://www.google.com/search?q=lyrics+%22Tænder+På+Dig%22+%22Jakob+Sveistrup%22";

Обратите внимание на некоторые символы с диакритическими знаками. Когда я пытаюсь превратить это в URL-адрес, возвращаемый URL-адрес равен нулю ...

[NSURL URLWithString:googleSearchString];

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


person regulus6633    schedule 23.01.2010    source источник


Ответы (5)


Вам нужно экранировать специальные символы, чтобы он работал правильно. Что-то типа:

[NSURL URLWithString:[googlSearchString stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding]];
person clee    schedule 23.01.2010
comment
Это работает! Спасибо за ответ. Я только что нашел функцию CFURLCreateStringByAddingPercentEscapes (), так что любой из них выполнит свою работу. - person regulus6633; 24.01.2010
comment
Стоит отметить, что это определенно будет обрабатывать ваши иностранные символы, но не будет должным образом обрабатывать небуквенные символы, такие как + или /. NSString не имеет встроенной функции, которая действительно правильно кодирует URL, но эта работает для расширенных символов. - person clee; 24.01.2010
comment
Вопрос: для веб-адресов ... Следует ли использовать NSASCIIStringEncoding или NSUTF8StringEncoding - person regulus6633; 24.01.2010
comment
Я бы сам придерживался NSASCIIStringEncoding. - person clee; 24.01.2010
comment
Используйте 1_. Кодировка определяет, какие байты будут описаны в процентном переходе. Если вы используете ASCII, не гарантируется, что акцентированные символы сохранятся или, если они это сделают, будут закодированы в какой-либо конкретной кодировке, потому что эти символы не находятся в ASCII. Более того, если какой-либо из символов не находится в той кодировке, которая вам нравится какао (например, что-либо в практически любом азиатском языке), метод все равно вернет nil. - person Peter Hosey; 24.01.2010
comment
К сожалению, в документации не упоминается, какую кодировку вы обычно должны использовать (и звуковой совет Питера). Я бы посоветовал людям подать на него радар. - person Mike Abdullah; 24.01.2010
comment
После тестирования на датской машине друга NSASCIIStringEncoding не работал. NSUTF8StringEncoding действительно сработал, поэтому я собираюсь с этим. - person regulus6633; 25.01.2010
comment
Ооо! Моя ошибка, извините за плохой совет. Я отредактирую ответ, чтобы отразить правильную кодировку. - person clee; 25.01.2010
comment
В этом примере OP имеет строку, которая уже на процент экранирована, не удастся ли это дважды избежать того, что% 22 заставит URL-адрес больше не указывать на то же место? - person ToddH; 28.01.2013

Используйте это для SWIFT 4:

let url = myURLString.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)
let myURL = URL(string: url)
person Yaroslav Dukal    schedule 23.02.2018

Использование Swift 2.2

Для экранирования неанглийских символов, например: для запроса URL выполните:

let urlPath = path.URLString.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet())

Здесь urlPath - это Optional, а path - ваш исходный URL (тот, который содержит неанглийские символы).

person Hugo Alonso    schedule 19.04.2016

В 2k16 метод stringByAddingPercentEscapesUsingEncoding: устарел, и от него невозможно избавиться. Когда URL-адрес предопределен, просто используйте закодированную строку браузера, потому что метод stringByAddingPercentEncodingWithAllowedCharacters: не может экранировать весь URL-адрес.

person Timur Bernikovich    schedule 12.12.2016

Иногда эту проблему может вызвать пробел в URL-адресе.

person Martin Jacob    schedule 10.09.2013