Как создать пользовательский NSCharacterSet?
Я использую CharacterSet.urlQueryAllowed
чтобы добавить процентную кодировку в строку.
Некоторые символы закодированы не так, как я ожидал (т.е. &
и ?
Не изменены). При этом у меня возникла идея создать собственный набор CharacterSet
, в идеале основанный на существующем.
Каков наилучший подход для этого?
Ответы
Ответ 1
Наиболее типичный способ создания нового набора символов - это использование CharacterSet(charactersIn:)
, который дает String
со всеми символами набора.
Добавление некоторых символов в существующий набор может быть достигнуто с помощью:
let characterSet = NSMutableCharacterSet() //create an empty mutable set
characterSet.formUnionWithCharacterSet(NSCharacterSet.URLQueryAllowedCharacterSet())
characterSet.addCharactersInString("?&")
или в Swift 3+ просто:
var characterSet = CharacterSet.urlQueryAllowed
characterSet.insert(charactersIn: "?&")
Для кодирования URL также обратите внимание на кодировку URL Objective-C и Swift.
Ответ 2
Вы можете попробовать мой метод:
let password = "[email protected]#$%^&*()-_abcdABCD1234`~"
// Swift 2.3
extension NSCharacterSet {
static var rfc3986Unreserved: NSCharacterSet {
let mutable = NSMutableCharacterSet()
mutable.formUnionWithCharacterSet(.alphanumericCharacterSet())
mutable.addCharactersInString("-_.~")
return mutable
}
}
let encoding = password.stringByAddingPercentEncodingWithAllowedCharacters(.rfc3986Unreserved)
// Swift 3
extension CharacterSet {
static var rfc3986Unreserved: CharacterSet {
return CharacterSet(charactersIn: "-_.~").union(.alphanumerics)
}
}
let encoding = password.addingPercentEncoding(withAllowedCharacters: .rfc3986Unreserved)
Print:
original -> [email protected]#$%^&*()-_abcdABCD1234`~
encoding -> %3F%2B%3D%21%40%23%24%25%5E%26%2A%28%29-_abcdABCD1234%60~
RFC3986:
https://tools.ietf.org/html/rfc3986
![reference]()