addingPercentEncoding
지정된 CharacterSet에 포함되지 않은 문자열을
Percent Endcoing의 문자로 대체하여 새로운 문자열로 반환합니다.
일단 URL 같은 경우 공백이나 한글이 포함되면
리턴값으로 nil이 나오게 되는데요.
이때 Percent Endcoing을 통해 변환시켜 인식이 가능하도록
도와줄 수 있죠.
선언은 아래와 같이 돼있습니다.
func addingPercentEncoding(withAllowedCharacters allowedCharacters: CharacterSet) -> String?
여기서 CharacterSet란
유니코드 호환 문자의 집합을 나타냅니다.
여러 문자를 그룹화하여 사용을 편리하게 분류해 놓은 구조체입니다.
CharacterSet에서
URL Encoding을 편리하게 도와주는 구성 세트가 있습니다.
URL Encoding 관련 구성은 이와 같습니다.
urlUserAllowed
, urlPasswordAllowed
, urlHostAllowed
,
urlPathAllowed
, urlQueryAllowed
, urlFragmentAllowed
일단 이름부터가 허용시킨다고 하네요.
코드로 어떤 문자열을 포함하는지 확인해 봅시다.
extension CharacterSet {
func allCharacters() -> [Character] {
var result: [Character] = []
for plane: UInt8 in 0...16 where self.hasMember(inPlane: plane) {
for unicode in UInt32(plane) << 16 ..< UInt32(plane + 1) << 16 {
if let uniChar = UnicodeScalar(unicode), self.contains(uniChar) {
result.append(Character(uniChar))
}
}
}
return result
}
}
let set: [CharacterSet] = [
.urlUserAllowed,
.urlPasswordAllowed,
.urlHostAllowed,
.urlPathAllowed,
.urlQueryAllowed,
.urlFragmentAllowed
]
set.forEach{
$0.allCharacters()
.filter { !$0.isLetter && !$0.isNumber }
.forEach { print($0, terminator: " ") }
print("")
}
// urlUserAllowed ! $ & ' ( ) * + , - . ; = _ ~
// urlPasswordAllowed ! $ & ' ( ) * + , - . ; = _ ~
// urlHostAllowed ! $ & ' ( ) * + , - . : ; = [ ] _ ~
// urlPathAllowed ! $ & ' ( ) * + , - . / : = @ _ ~
// urlQueryAllowed ! $ & ' ( ) * + , - . / : ; = ? @ _ ~
// urlFragmentAllowed ! $ & ' ( ) * + , - . / : ; = ? @ _ ~
위와 같이 CharacterSet에 포함된 문자열이 나옵니다.
만약 addingPercentEncoding
을 사용 시
위의 결과를 제외한 나머지를 인코딩 시켜 변환시켜 주는 거죠.
사용
addingPercentEncoding
사용 시
현재 필요한 CharacterSet에 맞춰 선택하여 사용하시면 됩니다.
간단한 예시
let city = "Los Angeles"
city.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)
// Los%20Angeles
let urlStr = "https://tistory.com/search?keyword=접근 제어"
let stringByAddingPercentEncodingForURL = urlStr.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)!
let url = URL(string: stringByAddingPercentEncodingForURL)
// https://tistory.com/search?keyword=%EC%A0%91%EA%B7%BC%20%EC%A0%9C%EC%96%B4
이와 같이
익스텐션과 같이 사용하면 편리해지죠!
extension String {
var stringByAddingPercentEncoding: String {
return self.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? self
}
}
let urlStr = "https://tistory.com/search?keyword=Los Angeles"
let url = URL(string: urlStr.stringByAddingPercentEncoding)
// https://tistory.com/search?keyword=Los%20Angeles
부록
허용하고 싶은 문자열을 직접 만들어서 사용도 가능합니다.
extension String {
var stringByAddingPercentEncoding: String {
// 허용할 문자열
let unreserved = ".=/:?"
let allowed = NSMutableCharacterSet.alphanumeric()
allowed.addCharacters(in: unreserved)
return self.addingPercentEncoding(withAllowedCharacters: allowed as CharacterSet) ?? self
}
}
let urlStr = "https://tistory.com/search?keyword=Los Angeles"
let url = URL(string: urlStr.stringByAddingPercentEncoding)
// https://tistory.com/search?keyword=Los%20Angeles
참고
'Xcode > Swift 문법' 카테고리의 다른 글
[iOS/Swift] 옵셔널(Optional, ?) 정리 (0) | 2023.02.20 |
---|---|
[iOS/Swift] String Format 사용법 (정수, 소수점, 문자열 변환) (0) | 2023.02.14 |
[iOS/Swift] URL, URLComponents 빠개기 (0) | 2023.02.11 |
[iOS/Swift] 프로토콜 CaseIterable (열거형에서 모든 case를 배열로 다루기) (2) | 2023.02.09 |
[iOS/Swift] 이니셜라이저(init)와 고차함수 (0) | 2023.02.08 |