390 Stimmen

Swift - URL codieren

Wenn ich einen String so kodiere:

var escapedString = originalString.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)

werden die Schrägstriche / nicht maskiert.

Ich habe gesucht und diesen Objective-C-Code gefunden:

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

Gibt es einen einfacheren Weg, eine URL zu codieren und wenn nicht, wie schreibe ich das in Swift?

5voto

Hardik Thakkar Punkte 14308

Für Swift 5 zum Codieren von Strings

func escape(string: String) -> String {
    let allowedCharacters = string.addingPercentEncoding(withAllowedCharacters: CharacterSet(charactersIn: ":=\"#%/<>?@\\^`{|}").inverted) ?? ""
    return allowedCharacters
}

Wie benutzt man es?

let strEncoded = self.escape(string: "http://www.edamam.com/ontologies/edamam.owl#recipe_e2a1b9bf2d996cbd9875b80612ed9aa4")
print("escapedString: \(strEncoded)")

4voto

BadPirate Punkte 25244

Selbst benötigt, also habe ich eine String-Erweiterung geschrieben, die es sowohl ermöglicht, Strings URL-codiert als auch das häufigere Endziel, das Konvertieren eines Parameter-Dictionarys in "GET"-Style-URL-Parameter zu ermöglichen:

extension String {
    func URLEncodedString() -> String? {
        var escapedString = self.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)
        return escapedString
    }
    static func queryStringFromParameters(parameters: Dictionary) -> String? {
        if (parameters.count == 0)
        {
            return nil
        }
        var queryString : String? = nil
        for (key, value) in parameters {
            if let encodedKey = key.URLEncodedString() {
                if let encodedValue = value.URLEncodedString() {
                    if queryString == nil
                    {
                        queryString = "?"
                    }
                    else
                    {
                        queryString! += "&"
                    }
                    queryString! += encodedKey + "=" + encodedValue
                }
            }
        }
        return queryString
    }
}

Viel Spaß!

3voto

Gaurav Singla Punkte 2271

Dies funktioniert für mich.

func stringByAddingPercentEncodingForFormData(plusForSpace: Bool=false) -> String? {

    let unreserved = "*-._"
    let allowed = NSMutableCharacterSet.alphanumericCharacterSet()
    allowed.addCharactersInString(unreserved)

    if plusForSpace {
        allowed.addCharactersInString(" ")
    }

    var encoded = stringByAddingPercentEncodingWithAllowedCharacters(allowed)

    if plusForSpace {
        encoded = encoded?.stringByReplacingOccurrencesOfString(" ", withString: "+")
    }
    return encoded
}

Ich habe die oben genannte Funktion von diesem Link gefunden: http://useyourloaf.com/blog/how-to-percent-encode-a-url-string/.

2voto

jaskiratjd Punkte 699

let Url = URL(string: urlString.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? "")

2voto

Keine dieser Antworten hat für mich funktioniert. Unsere App ist abgestürzt, wenn eine URL nicht-englische Zeichen enthielt.

 let unreserved = "-._~/?%$!:"
 let allowed = NSMutableCharacterSet.alphanumeric()
     allowed.addCharacters(in: unreserved)

 let escapedString = urlString.addingPercentEncoding(withAllowedCharacters: allowed as CharacterSet)

Je nach den Parametern dessen, was du versuchst zu erreichen, möchtest du vielleicht einfach dein eigenes Zeichen-Set erstellen. Das obige erlaubt englische Zeichen und -._~/?%$!:

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X