[ios] 스위프트-URL 인코딩

다음과 같은 문자열을 인코딩하면 :

var escapedString = originalString.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)

슬래시를 벗어나지 않습니다 /.

이 Objective C 코드를 검색하고 찾았습니다.

NSString *encodedString = (NSString *)CFURLCreateStringByAddingPercentEscapes(
                        NULL,
                        (CFStringRef)unencodedString,
                        NULL,
                        (CFStringRef)@"!*'();:@&=+$,/?%#[]",
                        kCFStringEncodingUTF8 );

URL을 인코딩하는 더 쉬운 방법이 있습니까? 그렇지 않은 경우 Swift에서 어떻게 작성합니까?



답변

스위프트 3

스위프트 3에는 addingPercentEncoding

let originalString = "test/test"
let escapedString = originalString.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)
print(escapedString!)

산출:

test % 2 최신

스위프트 1

iOS 7 이상에는 stringByAddingPercentEncodingWithAllowedCharacters

var originalString = "test/test"
var escapedString = originalString.stringByAddingPercentEncodingWithAllowedCharacters(.URLHostAllowedCharacterSet())
println("escapedString: \(escapedString)")

산출:

test % 2 최신

다음은 유용한 (반전 된) 문자 집합입니다.

URLFragmentAllowedCharacterSet  "#%<>[\]^`{|}
URLHostAllowedCharacterSet      "#%/<>?@\^`{|}
URLPasswordAllowedCharacterSet  "#%/:<>?@[\]^`{|}
URLPathAllowedCharacterSet      "#%;<>?[\]^`{|}
URLQueryAllowedCharacterSet     "#%<>[\]^`{|}
URLUserAllowedCharacterSet      "#%/:<>?@[\]^`

다른 문자 집합을 이스케이프하려면
“=”문자가 추가 된 예 :

var originalString = "test/test=42"
var customAllowedSet =  NSCharacterSet(charactersInString:"=\"#%/<>?@\\^`{|}").invertedSet
var escapedString = originalString.stringByAddingPercentEncodingWithAllowedCharacters(customAllowedSet)
println("escapedString: \(escapedString)")

산출:

test % 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)\'")
}


답변

URLComponent를 사용하면 쿼리 문자열을 수동으로 퍼센트 인코딩하지 않아도됩니다.

let scheme = "https"
let host = "www.google.com"
let path = "/search"
let queryItem = URLQueryItem(name: "q", value: "Formula One")


var urlComponents = URLComponents()
urlComponents.scheme = scheme
urlComponents.host = host
urlComponents.path = path
urlComponents.queryItems = [queryItem]

if let url = urlComponents.url {
    print(url)   // "https://www.google.com/search?q=Formula%20One"
}

extension URLComponents {
    init(scheme: String = "https",
         host: String = "www.google.com",
         path: String = "/search",
         queryItems: [URLQueryItem]) {
        self.init()
        self.scheme = scheme
        self.host = host
        self.path = path
        self.queryItems = queryItems
    }
}

let query = "Formula One"
if let url = URLComponents(queryItems: [URLQueryItem(name: "q", value: query)]).url {
    print(url)  // https://www.google.com/search?q=Formula%20One
}


답변

스위프트 3 :

let originalString = "http://www.ihtc.cc?name=htc&title=iOS开发工程师"

1. encodingQuery :

let escapedString = originalString.addingPercentEncoding(withAllowedCharacters:NSCharacterSet.urlQueryAllowed)

결과:

"http://www.ihtc.cc?name=htc&title=iOS%E5%BC%80%E5%8F%91%E5%B7%A5%E7%A8%8B%E5%B8%88" 

2. encodingURL :

let escapedString = originalString.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)

결과:

"http:%2F%2Fwww.ihtc.cc%3Fname=htc&title=iOS%E5%BC%80%E5%8F%91%E5%B7%A5%E7%A8%8B%E5%B8%88"


답변

스위프트 3 :

let allowedCharacterSet = (CharacterSet(charactersIn: "!*'();:@&=+$,/?%#[] ").inverted)

if let escapedString = originalString.addingPercentEncoding(withAllowedCharacters: allowedCharacterSet) {
//do something with escaped string
}


답변

스위프트 4

URL에서 매개 변수를 인코딩하려면 .alphanumerics문자 세트를 사용하여 가장 쉬운 옵션을 찾으십시오 .

let encoded = parameter.addingPercentEncoding(withAllowedCharacters: .alphanumerics)
let url = "http://www.example.com/?name=\(encoded!)"

URL 인코딩에 표준 문자 세트 ( URLQueryAllowedCharacterSet또는 등 URLHostAllowedCharacterSet)를 사용하면 제외 =되거나 &문자 가 없으므로 작동하지 않습니다 .

참고 사용하여 해당 .alphanumerics인코딩 할 필요가없는 일부 문자를 인코딩합니다 그것을 (같은 -, ., _또는 ~– 참조 . 2.3 예약되지 않은 문자 RFC 3986에서 참조). .alphanumerics사용자 정의 문자 집합을 구성하는 것보다 간단한 것을 사용 하고 일부 추가 문자를 인코딩하지 않아도됩니다. 그게 당신을 귀찮게한다면, 예를 들어 URL 문자열을 퍼센트 인코딩하는 방법에 설명 된 것처럼 사용자 정의 문자 세트를 구성하십시오 .

var allowed = CharacterSet.alphanumerics
allowed.insert(charactersIn: "-._~") // as per RFC 3986
let encoded = parameter.addingPercentEncoding(withAllowedCharacters: allowed)
let url = "http://www.example.com/?name=\(encoded!)"

경고 :encoded매개 변수는 강제로 래핑되지 않습니다. 잘못된 유니 코드 문자열의 경우 충돌이 발생할 수 있습니다. String.addingPercentEncoding ()의 반환 값이 선택적인 이유를 참조하십시오 . . 강제로 풀기 대신을 encoded!사용 encoded ?? ""하거나 사용할 수 있습니다 if let encoded = ....


답변

모든 것이 동일

var str = CFURLCreateStringByAddingPercentEscapes(
    nil,
    "test/test",
    nil,
    "!*'();:@&=+$,/?%#[]",
    CFStringBuiltInEncodings.UTF8.rawValue
)

// test%2Ftest


답변

스위프트 4 :

서버에 따라 인코딩 규칙에 따라 다릅니다.

Apple은이 클래스 방법을 제공하지만 그에 따르는 RCF 프로토콜은보고하지 않습니다.

var escapedString = originalString.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)!

이 유용한 도구사용 하면 매개 변수에 대한 이러한 문자의 인코딩을 보장해야합니다.

  • $ (Dollar Sign)은 % 24가됩니다.
  • & (앰퍼샌드)는 % 26이됩니다.
  • + (플러스)는 % 2B가됩니다
  • , (쉼표)는 % 2C가됩니다
  • : (콜론)은 % 3A가됩니다
  • ; (세미콜론) % 3B가됩니다
  • = (같음) % 3D가 됨
  • ? (물음표) % 3F가됩니다
  • @ (상업 A / At)가 % 40이됩니다.

다시 말해 URL 인코딩에 대해 말하면 RFC 1738 프로토콜 을 따라야 합니다 .

그리고 Swift는 예를 들어 + char의 인코딩을 다루지 않지만 다음 세 가지 @ 와 잘 작동합니다 . 문자.

따라서 각 매개 변수를 올바르게 인코딩하려면 .urlHostAllowed옵션이 충분하지 않으므로 다음과 같이 특수 문자를 추가해야합니다.

encodedParameter = parameter.replacingOccurrences(of: "+", with: "%2B")

이것이 미친 사람이 이러한 정보를 검색하는 데 도움이되기를 바랍니다.