Danny의 iOS 컨닝페이퍼
article thumbnail

addingPercentEncoding

지정된 CharacterSet포함되지 않은 문자열

Percent Endcoing의 문자로 대체하여 새로운 문자열로 반환합니다.

 

일단 URL 같은 경우 공백이나 한글이 포함되면

리턴값으로 nil이 나오게 되는데요.

 

이때 Percent Endcoing을 통해 변환시켜 인식이 가능하도록

도와줄 수 있죠.

 

선언은 아래와 같이 돼있습니다.

func addingPercentEncoding(withAllowedCharacters allowedCharacters: CharacterSet) -> String?

 

여기서 CharacterSet란

유니코드 호환 문자의 집합을 나타냅니다.

여러 문자를 그룹화하여 사용을 편리하게 분류해 놓은 구조체입니다.

 

CharacterSet에서

URL Encoding을 편리하게 도와주는 구성 세트가 있습니다.

 

URL Encoding 관련 구성은 이와 같습니다.

urlUserAllowed, urlPasswordAllowedurlHostAllowed,

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

 

 

참고

 

[Swift] addingPercentEncoding (URL 인코딩, 퍼센트 인코딩)

swift 에서 제공하는 퍼센트 인코딩 옵션이 있습니다. 그런데 인터넷에 잘못된 정보가 너무 많더라구요.. 직접 확인하실 수 있는 코드를 소개합니다. extension CharacterSet { func allCharacters() -> [Character]

baechukim.tistory.com

 

반응형
profile

Danny의 iOS 컨닝페이퍼

@Danny's iOS

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!