Как использовать stringByAddingPercentEncodingWithAllowedCharacters () для URL-адреса в Swift 2.0

Я использовал это в Swift 1.2

let urlwithPercentEscapes = myurlstring.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding) 

Это теперь дает мне предупреждение с просьбой использовать

 stringByAddingPercentEncodingWithAllowedCharacters 

Мне нужно использовать NSCharacterSet в качестве аргумента, но их так много, и я не могу определить, что даст мне тот же результат, что и использованный ранее метод.

Пример URL, который я хочу использовать, будет таким:

 http://www.mapquestapi.com/geocoding/v1/batch?key=YOUR_KEY_HERE&callback=renderBatch&location=Pottsville,PA&location=Red Lion&location=19036&location=1090 N Charlotte St, Lancaster, PA 

Набор символов URL для кодировки, по-видимому, содержит настройки обрезания моего URL-адреса. т.е.

Компонент пути URL-адреса – это компонент, следующий сразу за хост-компонентом (если присутствует). Он заканчивается там, где начинается компонент запроса или fragmentа. Например, в URL http://www.example.com/index.php?key1=value1 компонентом пути является /index.php.

Однако я не хочу обрезать любой его аспект. Когда я использовал свою строку, например myurlstring она потерпит неудачу.

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

 let urlwithPercentEscapes = myurlstring.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding) 

Как это

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

благодаря

Для данной строки URL эквивалент

 let urlwithPercentEscapes = myurlstring.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding) 

это набор символов URLQueryAllowedCharacterSet

 let urlwithPercentEscapes = myurlstring.stringByAddingPercentEncodingWithAllowedCharacters( NSCharacterSet.URLQueryAllowedCharacterSet()) 

Swift 3:

 let urlwithPercentEscapes = myurlstring.addingPercentEncoding( withAllowedCharacters: .urlQueryAllowed) 

Он кодирует все после знака вопроса в строке URL.

Поскольку метод stringByAddingPercentEncodingWithAllowedCharacters может возвращать stringByAddingPercentEncodingWithAllowedCharacters , используйте необязательные привязки, как это предложено в ответе Льва Дабуса.

Это будет зависеть от вашего URL. Если ваш URL-адрес – это путь, вы можете использовать набор символов urlPathAllowed

 let myFileString = "My File.txt" if let urlwithPercentEscapes = myFileString.addingPercentEncoding(withAllowedCharacters: .urlPathAllowed) { print(urlwithPercentEscapes) // "My%20File.txt" } 

Создание набора символов для кодировки URL

urlFragmentAllowed

urlHostAllowed

urlPasswordAllowed

urlQueryAllowed

urlUserAllowed

Вы также можете создать собственный набор символов URL:

 let myUrlString = "http://www.mapquestapi.com/geocoding/v1/batch?key=YOUR_KEY_HERE&callback=renderBatch&location=Pottsville,PA&location=Red Lion&location=19036&location=1090 N Charlotte St, Lancaster, PA" let urlSet = CharacterSet.urlFragmentAllowed .union(.urlHostAllowed) .union(.urlPasswordAllowed) .union(.urlQueryAllowed) .union(.urlUserAllowed) 

 extension CharacterSet { static let urlAllowed = CharacterSet.urlFragmentAllowed .union(.urlHostAllowed) .union(.urlPasswordAllowed) .union(.urlQueryAllowed) .union(.urlUserAllowed) } 

 if let urlwithPercentEscapes = myUrlString.addingPercentEncoding(withAllowedCharacters: .urlAllowed) { print(urlwithPercentEscapes) // "http://www.mapquestapi.com/geocoding/v1/batch?key=YOUR_KEY_HERE&callback=renderBatch&location=Pottsville,PA&location=Red%20Lion&location=19036&location=1090%20N%20Charlotte%20St,%20Lancaster,%20PA" } 

Другой вариант – использовать URLComponents для правильного создания вашего URL-адреса

Swift 3.0 (от grokswift )

Создание URL-адресов из строк – это минное поле для ошибок. Просто пропустите одиночный / или случайно URL-код? в запросе и ваш вызов API не удастся, и ваше приложение не будет иметь никаких данных для отображения (или даже сбой, если вы этого не ожидали). С iOS 8 существует лучший способ создания URL-адресов с использованием NSURLComponents и NSURLQueryItems .

 func createURLWithComponents() -> URL? { var urlComponents = URLComponents() urlComponents.scheme = "http" urlComponents.host = "www.mapquestapi.com" urlComponents.path = "/geocoding/v1/batch" let key = URLQueryItem(name: "key", value: "YOUR_KEY_HERE") let callback = URLQueryItem(name: "callback", value: "renderBatch") let locationA = URLQueryItem(name: "location", value: "Pottsville,PA") let locationB = URLQueryItem(name: "location", value: "Red Lion") let locationC = URLQueryItem(name: "location", value: "19036") let locationD = URLQueryItem(name: "location", value: "1090 N Charlotte St, Lancaster, PA") urlComponents.queryItems = [key, callback, locationA, locationB, locationC, locationD] return urlComponents.url } 

Ниже приведен код доступа к URL-адресу с использованием инструкции guard .

 guard let url = createURLWithComponents() else { print("invalid URL") return nil } print(url) 

Вывод:

 http://www.mapquestapi.com/geocoding/v1/batch?key=YOUR_KEY_HERE&callback=renderBatch&location=Pottsville,PA&location=Red%20Lion&location=19036&location=1090%20N%20Charlotte%20St,%20Lancaster,%20PA 

В моем случае, когда последний компонент был не латинским символом, я сделал следующее в Swift 2.2:

 extension String { func encodeUTF8() -> String? { //If I can create an NSURL out of the string nothing is wrong with it if let _ = NSURL(string: self) { return self } //Get the last component from the string this will return subSequence let optionalLastComponent = self.characters.split { $0 == "/" }.last if let lastComponent = optionalLastComponent { //Get the string from the sub sequence by mapping the characters to [String] then reduce the array to String let lastComponentAsString = lastComponent.map { String($0) }.reduce("", combine: +) //Get the range of the last component if let rangeOfLastComponent = self.rangeOfString(lastComponentAsString) { //Get the string without its last component let stringWithoutLastComponent = self.substringToIndex(rangeOfLastComponent.startIndex) //Encode the last component if let lastComponentEncoded = lastComponentAsString.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.alphanumericCharacterSet()) { //Finally append the original string (without its last component) to the encoded part (encoded last component) let encodedString = stringWithoutLastComponent + lastComponentEncoded //Return the string (original string/encoded string) return encodedString } } } return nil; } } 

В Swift 3.1 я использую что-то вроде следующего:

 let query = "param1=value1&param2=" + valueToEncode.addingPercentEncoding(withAllowedCharacters: .alphanumeric) 

Это безопаснее, чем .urlQueryAllowed и другие, потому что это будет кодировать каждый символ, отличный от AZ, az и 0-9. Это работает лучше, когда значение, которое вы кодируете, может использовать специальные символы, такие как?, &, =, + И пробелы.

Swift 4.0

 let encodedData = myUrlString.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlHostAllowed) 
  • В Java для строки x, какова стоимость выполнения s.length ()? O (1) или O (n)?
  • Замена символа в указанном индексе в строке?
  • Как преобразовать строку в enum в C #?
  • Оценка строки "3 * (4 + 2)" yield int 18
  • Какова цель выражения «new String (...)» в Java?
  • Как удалить строки из начала и конца строки (Java)?
  • Преобразование строки Hex в ASCII в Java
  • В чем разница между строковой константой и строковым литералом?
  • Как преобразовать между байтами и строками в Python 3?
  • Bash: разделите строку на массив символов
  • Окончание строки - char c = 0 vs char c = '\ 0'
  • Interesting Posts

    Получить значения из файла свойств с помощью Groovy

    Как я могу сделать свой IP-адрес видимым из другой страны?

    Какие каталоги в установке SSD для Windows 7 вы бы связали / соединились с HDD?

    Восстановление файлов с ноутбука с XP, который не загружается

    Могу ли я создать загрузочный USB-флеш-накопитель Linux с помощью компьютера под управлением Windows?

    StackOverflowError при сериализации объекта в Java

    В Cygwin нет команды sudo

    Что такое алгоритм JVM Scheduling?

    Загрузка файла Razor MVC 4

    Исключение при попытке выполнить «ЗАМЕНИТЬ» против доступа MS Access

    Является ли свободное программное обеспечение безопасности таким же, как платное программное обеспечение для обеспечения безопасности?

    Сохранить int в массиве char?

    Android Studio JAR-файл, вызывающий превышение лимита GC overhead

    script / tool для преобразования файла в массив исходного кода C / C ++

    Каков правильный способ отладки медленной установки Windows?

    Давайте будем гением компьютера.