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?

2voto

Was mir geholfen hat, war dass ich ein separates NSCharacterSet erstellt und es auf einen UTF-8-codierten String, d.h. textToEncode, angewendet habe, um das erforderliche Ergebnis zu generieren:

var queryCharSet = NSCharacterSet.urlQueryAllowed
queryCharSet.remove(charactersIn: "+&?,:;@+=$*()")

let utfedCharacterSet = String(utf8String: textToEncode.cString(using: .utf8)!)!
let encodedStr = utfedCharacterSet.addingPercentEncoding(withAllowedCharacters: queryCharSet)!

let paramUrl = "https://api.abc.eu/api/search?device=true&query=\(escapedStr)"

0voto

Vrushal Raut Punkte 866

SWIFT 4.2

Manchmal passiert dies nur, weil es Leerzeichen im Slug gibt oder weil die URL-Codierung für Parameter fehlt, die durch die API-URL übergeben werden.

let myString = self.slugValue
                let csCopy = CharacterSet(bitmapRepresentation: CharacterSet.urlPathAllowed.bitmapRepresentation)
                let escapedString = myString!.addingPercentEncoding(withAllowedCharacters: csCopy)!
                //always "info:hello%20world"
                print(escapedString)

HINWEIS: Vergiss nicht, dich über bitmapRepresentation zu erkundigen.

0voto

meomeomeo Punkte 794

Früher hatte ich ein Problem mit Strings wie diesem %5B×××%5D (bei dem einige Teile bereits codiert waren).

Es dauerte eine Stunde, bis ich realisierte, dass es mit diesem einfach gelöst werden kann:

extension String {
    var decodeThenEncodeURL: String {
        removingPercentEncoding?.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? self
    }
}
  • input: https://www.google.com/search?q=%5B×××%5D
  • output: https://www.google.com/search?q=%5B%C3%97%C3%97%C3%97%5D

-1voto

Zev003 Punkte 83

Dies ist besser und überzeugender. es zitiert aus Almofire URLEncodedFormEncoder.swift

extension CharacterSet {
    /// Erstellt ein CharacterSet aus den erlaubten Zeichen von RFC 3986.
    ///
    /// RFC 3986 besagt, dass die folgenden Zeichen "reserviert" sind.
    ///
    /// - Allgemeine Trennzeichen: ":", "#", "[", "]", "@", "?", "/"
    /// - Untertrennzeichen: "!", "$", "&", "'", "(", ")", "*", "+", ",", ";", "="
    ///
    /// In RFC 3986 - Abschnitt 3.4 wird festgelegt, dass die "?" und "/" Zeichen nicht maskiert werden sollten, um
    /// Abfragezeichenfolgen die Verwendung einer URL zu ermöglichen. Daher sollten alle "reservierten" Zeichen mit Ausnahme von "?" und "/"
    /// in der Abfragezeichenfolge prozentkodiert werden.
    public static let afURLQueryAllowed: CharacterSet = {
        let generalDelimitersToEncode = ":#[]@" // enthält nicht "?" oder "/" aufgrund von RFC 3986 - Abschnitt 3.4
        let subDelimitersToEncode = "!$&'()*+,;="
        let encodableDelimiters = CharacterSet(charactersIn: "\(generalDelimitersToEncode)\(subDelimitersToEncode)")

        return CharacterSet.urlQueryAllowed.subtracting(encodableDelimiters)
    }()
}

-2voto

Lgufan Punkte 95

Version:Swift 5

// Leerzeichen in + umwandeln
let mstring = string.replacingOccurrences(of: " ", with: "+")
// Sonderzeichen entfernen
var allowedQueryParamAndKey = NSCharacterSet.urlQueryAllowed
allowedQueryParamAndKey.remove(charactersIn: "!*'\"();:@&=+$,/?%#[]%")
return mstring.addingPercentEncoding(withAllowedCharacters: allowedQueryParamAndKey) ?? mstring

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