Свифт 3
В Swift 3 есть addingPercentEncoding
let originalString = "test/test"
let escapedString = originalString.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)
print(escapedString!)
Вывод:
Тест% 2Ftest
Свифт 1
В iOS 7 и выше есть stringByAddingPercentEncodingWithAllowedCharacters
var originalString = "test/test"
var escapedString = originalString.stringByAddingPercentEncodingWithAllowedCharacters(.URLHostAllowedCharacterSet())
println("escapedString: \(escapedString)")
Вывод:
Тест% 2Ftest
Ниже приведены полезные (инвертированные) наборы символов:
URLFragmentAllowedCharacterSet "#%<>[\]^`{|}
URLHostAllowedCharacterSet "#%/<>?@\^`{|}
URLPasswordAllowedCharacterSet "#%/:<>?@[\]^`{|}
URLPathAllowedCharacterSet "#%;<>?[\]^`{|}
URLQueryAllowedCharacterSet "#%<>[\]^`{|}
URLUserAllowedCharacterSet "#%/:<>?@[\]^`
Если вы хотите, чтобы другой набор символов был экранирован, создайте набор:
Пример с добавленным символом "=":
var originalString = "test/test=42"
var customAllowedSet = NSCharacterSet(charactersInString:"=\"#%/<>?@\\^`{|}").invertedSet
var escapedString = originalString.stringByAddingPercentEncodingWithAllowedCharacters(customAllowedSet)
println("escapedString: \(escapedString)")
Вывод:
Тест% 2Ftest% 3D42
Пример проверки символов ascii, не входящих в набор:
func printCharactersInSet(set: NSCharacterSet) {
var characters = ""
let iSet = set.invertedSet
for i: UInt32 in 32..<127 {
let c = Character(UnicodeScalar(i))
if iSet.longCharacterIsMember(i) {
characters = characters + String(c)
}
}
print("characters not in set: \'\(characters)\'")
}
stringByAddingPercentEncodingWithAllowedCharacters()
оставляет мало сомнений в том, что он делает. Интересный комментарий, учитывая, как долго слово «ошеломленный».&
в набор символовURLQueryAllowedCharacterSet
и получил каждый кодированный символ. Проверено с iOS 9, похоже глючит, я пошел с ответом @ bryanchen, все работает хорошо !!URLComponents
иURLQueryItem
намного чище ИМО.Вы можете использовать URLComponents, чтобы избежать необходимости вручную кодировать строку запроса в процентах:
источник
URLQueryItem
не всегда правильно кодирует. Например,Formula+One
будет закодирован вFormula+One
, который будет декодирован вFormula One
. Поэтому будьте осторожны со знаком плюс.Свифт 3:
1. encodingQuery:
результат:
2. encodingURL:
результат:
источник
urlHostAllowed
для кодирования параметров запроса неверно, потому что он не будет кодировать?
,=
и+
. При кодировании параметров запроса вы должны кодировать имя и значение параметра отдельно и правильно. Это не будет работать в общем случае.urlHostAllowed
URLComponents
.+
символ. Поэтому единственный вариант - сделать это вручную:CharacterSet.urlQueryAllowed.subtracting(CharacterSet(charactersIn: "+"))
Свифт 3:
источник
Swift 4
Для кодирования параметра в URL я нахожу использование
.alphanumerics
набора символов самым простым вариантом:Использование любого из стандартных наборов символов для кодирования URL (например,
URLQueryAllowedCharacterSet
илиURLHostAllowedCharacterSet
) не будет работать, потому что они не исключают=
или&
символы символы.Обратите внимание , что при использовании
.alphanumerics
его кодируют некоторые символы , которые не должны быть закодированы (например-
,.
,_
или~
- см 2.3 незарезервированной символы. В RFC 3986). Я считаю, что использовать.alphanumerics
проще, чем создавать собственный набор символов, и не против некоторых дополнительных символов для кодирования. Если это вас беспокоит, создайте пользовательский набор символов, как описано в разделе Как кодировать строку URL в процентах , например:Предупреждение:
encoded
параметр силы разворачивали. Для недопустимой строки Unicode может произойти сбой. См. Почему возвращаемое значение String.addingPercentEncoding () необязательно? , Вместо принудительного развертыванияencoded!
вы можете использоватьencoded ?? ""
или использоватьif let encoded = ...
.источник
Все одинаково
источник
.bridgeToOvjectiveC()
указали второй аргумент и не получили "Невозможно преобразовать тип выражения 'CFString!' набрать 'CFString!' "?Свифт 4:
Это зависит от правил кодирования вашего сервера.
Apple предлагает этот метод класса, но он не сообщает, какой протокол RCF следует.
Следуя этому полезному инструменту, вы должны гарантировать кодирование этих символов для ваших параметров:
Другими словами, говоря о кодировании URL, вы должны следовать протоколу RFC 1738 .
И Swift не охватывает, например , кодировку + char , но она хорошо работает с этими тремя @:? символы.
Таким образом, для правильной кодировки каждого вашего параметра
.urlHostAllowed
опции недостаточно, вам следует добавить также специальные символы, например:Надеюсь, что это помогает кому-то, кто сходит с ума, чтобы искать эту информацию.
источник
Swift 4 (не тестировался - прокомментируйте, работает ли он или нет. Спасибо @sumizome за предложение)
Свифт 3
Swift 2.2 (заимствование у Zaph и исправление для ключа URL-запроса и значений параметров)
Пример:
Это более короткая версия ответа Брайана Чена. Я предполагаю, что
urlQueryAllowed
разрешается использовать управляющие символы, если они не являются частью ключа или значения в строке запроса, и в этот момент их необходимо экранировать.источник
var
), а затем вызовите.remove
его на втором этапе.Swift 4.2
Быстрое решение в одну строку. Замените
originalString
на строку, которую вы хотите кодировать.Демоверсия игровой площадки
источник
Я сам нуждался в этом, поэтому я написал расширение String, которое учитывает строки URLEncoding, а также более общую конечную цель - преобразование словаря параметров в URL-параметры стиля "GET":
Наслаждайтесь!
источник
&
или=
в параметрах. Проверьте мое решение вместо этого.Этот работает на меня.
Я нашел выше функцию по этой ссылке: http://useyourloaf.com/blog/how-to-percent-encode-a-url-string/ .
источник
let Url = URL(string: urlString.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? "")
источник
SWIFT 4.2
Иногда это происходит только потому, что в слаге ИЛИ отсутствует кодировка URL для параметров, проходящих через API URL.
ПРИМЕЧАНИЕ: не забудьте изучить
bitmapRepresentation
.источник
Это работает для меня в Swift 5 . В случае использования берется URL-адрес из буфера обмена или аналогичный, который, возможно, уже содержит экранированные символы, но также содержит символы Юникода, которые могут вызвать
URLComponents
или вызватьURL(string:)
сбой.Сначала создайте набор символов, который включает все допустимые для URL символы:
Затем добавьте
String
метод для кодирования URL:Который может быть проверен как:
Значение
url
в конце:https://www.example.com/%ED%8F%B4%EB%8D%94/search?q=123&foo=bar&multi=eggs+and+ham&hangul=%ED%95%9C%EA%B8%80&spaced=lovely%20spam&illegal=%3C%3E#top
Обратите внимание, что оба
%20
и+
интервал сохраняются, символы Unicode кодируются,%20
в оригиналеurlText
не кодируется дважды, а привязка (фрагмент или#
) остается.Редактировать: теперь проверка на правильность каждого компонента.
источник
Для Swift 5 в конец строки кода
Как пользоваться ?
источник
Ни один из этих ответов не работал для меня. Наше приложение зависало, когда URL содержал неанглийские символы.
В зависимости от параметров того, что вы пытаетесь сделать, вы можете просто создать свой собственный набор символов. Выше учитывает английские символы, и
-._~/?%$!:
источник