it-swarm.com.de

Ersatz für stringByAddingPercentEscapesUsingEncoding in ios9?

In iOS8 und früher kann ich Folgendes verwenden:

NSString *str = ...; // some URL
NSString *result = [str stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

in iOS9 wurde stringByAddingPercentEscapesUsingEncoding durch stringByAddingPercentEncodingWithAllowedCharacters ersetzt:

NSString *str = ...; // some URL
NSCharacterSet *set = ???; // where to find set for NSUTF8StringEncoding?
NSString *result = [str stringByAddingPercentEncodingWithAllowedCharacters:set];

und meine Frage ist: Wo finde ich NSCharacterSet (NSUTF8StringEncoding), um stringByAddingPercentEscapesUsingEncoding zu ersetzen?

99
slavik

Die Nachricht über die Missweisung sagt (Hervorhebung meines):

Verwenden Sie stringByAddingPercentEncodingWithAllowedCharacters (_ :) stattdessen verwendet immer die empfohlene UTF-8-Kodierung und die für eine bestimmte URL-Komponente oder Unterkomponente codiert, da für jede URL-Komponente oder Unterkomponente unterschiedliche Regeln gelten, für welche Zeichen gültige Zeichen gelten.

Sie müssen also nur eine geeignete NSCharacterSet als Argument angeben. Glücklicherweise gibt es für URLs eine sehr praktische Klassenmethode namens URLHostAllowedCharacterSet, die Sie wie folgt verwenden können:

let encodedHost = unencodedHost.stringByAddingPercentEncodingWithAllowedCharacters(.URLHostAllowedCharacterSet())

Update für Swift 3 - Die Methode wird zur statischen Eigenschaft urlHostAllowed:

let encodedHost = unencodedHost.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)

Beachten Sie jedoch Folgendes:

Diese Methode soll eine URL-Komponente oder eine Unterkomponentenzeichenfolge in Prozent kodieren, NICHT eine gesamte URL-Zeichenfolge.

125
Antonio Favata

Für Ziel-C:

NSString *str = ...; // some URL
NSCharacterSet *set = [NSCharacterSet URLHostAllowedCharacterSet]; 
NSString *result = [str stringByAddingPercentEncodingWithAllowedCharacters:set];

wo finde ich das Set für NSUTF8StringEncoding? 

Es gibt vordefinierte Zeichensätze für die sechs URL-Komponenten und Unterkomponenten, die eine prozentuale Codierung ermöglichen. Diese Zeichensätze werden an -stringByAddingPercentEncodingWithAllowedCharacters: übergeben.

 // Predefined character sets for the six URL components and subcomponents which allow percent encoding. These character sets are passed to -stringByAddingPercentEncodingWithAllowedCharacters:.
@interface NSCharacterSet (NSURLUtilities)
+ (NSCharacterSet *)URLUserAllowedCharacterSet;
+ (NSCharacterSet *)URLPasswordAllowedCharacterSet;
+ (NSCharacterSet *)URLHostAllowedCharacterSet;
+ (NSCharacterSet *)URLPathAllowedCharacterSet;
+ (NSCharacterSet *)URLQueryAllowedCharacterSet;
+ (NSCharacterSet *)URLFragmentAllowedCharacterSet;
@end

Die Nachricht über die Missweisung sagt (Hervorhebung meines):

Verwenden Sie stattdessen stringByAddingPercentEncodingWithAllowedCharacters (_ :), wobei immer die empfohlene UTF-8-Codierung verwendet und die für eine bestimmte URL-Komponente oder Unterkomponente codiert, da für jede URL-Komponente oder Unterkomponente unterschiedliche Regeln gelten, für welche Zeichen gültige Zeichen gelten.

Sie müssen also nur eine geeignete NSCharacterSet als Argument angeben. Glücklicherweise gibt es für URLs eine sehr praktische Klassenmethode namens URLHostAllowedCharacterSet, die Sie wie folgt verwenden können:

NSCharacterSet *set = [NSCharacterSet URLHostAllowedCharacterSet]; 

Beachten Sie jedoch Folgendes:

Diese Methode soll eine URL-Komponente oder eine Unterkomponentenzeichenfolge in Prozent kodieren, NICHT eine gesamte URL-Zeichenfolge.

92
ElonChan

URLHostAllowedCharacterSet ist NICHT ARBEITEN FÜR MICH. Ich benutze stattdessen URLFragmentAllowedCharacterSet

ZIEL C

NSCharacterSet *set = [NSCharacterSet URLFragmentAllowedCharacterSet];
NSString * encodedString = [@"url string" stringByAddingPercentEncodingWithAllowedCharacters:set];

Swift - 4

"url string".addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)

Die folgenden sind nützliche (invertierte) Zeichensätze:

URLFragmentAllowedCharacterSet  "#%<>[\]^`{|}
URLHostAllowedCharacterSet      "#%/<>[email protected]\^`{|}
URLPasswordAllowedCharacterSet  "#%/:<>[email protected][\]^`{|}
URLPathAllowedCharacterSet      "#%;<>?[\]^`{|}
URLQueryAllowedCharacterSet     "#%<>[\]^`{|}
URLUserAllowedCharacterSet      "#%/:<>[email protected][\]^`
39
Lal Krishna

Ziel c

dieser Code funktioniert für mich:

urlString = [urlString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLFragmentAllowedCharacterSet]];
21
Bilal L

Swift 2.2:

extension String {
 func encodeUTF8() -> String? {
//If I can create an NSURL out of the string nothing is wrong with it
if let _ = NSURL(string: self) {

    return self
}

//Get the last component from the string this will return subSequence
let optionalLastComponent = self.characters.split { $0 == "/" }.last


if let lastComponent = optionalLastComponent {

    //Get the string from the sub sequence by mapping the characters to [String] then reduce the array to String
    let lastComponentAsString = lastComponent.map { String($0) }.reduce("", combine: +)


    //Get the range of the last component
    if let rangeOfLastComponent = self.rangeOfString(lastComponentAsString) {
        //Get the string without its last component
        let stringWithoutLastComponent = self.substringToIndex(rangeOfLastComponent.startIndex)


        //Encode the last component
        if let lastComponentEncoded = lastComponentAsString.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.alphanumericCharacterSet()) {


        //Finally append the original string (without its last component) to the encoded part (encoded last component)
        let encodedString = stringWithoutLastComponent + lastComponentEncoded

            //Return the string (original string/encoded string)
            return encodedString
        }
    }
}

return nil;
}
}
4
Bobj-C

Für Swift 3.0

Sie können urlHostAllowed characterSet verwenden.

/// Gibt den Zeichensatz für Zeichen zurück, die in einer Unterkomponente der Host-URL zulässig sind.

public static var urlHostAllowed: CharacterSet { get }

WebserviceCalls.getParamValueStringForURLFromDictionary(settingsDict as! Dictionary<String, AnyObject>).addingPercentEncoding(withAllowedCharacters: CharacterSet.urlHostAllowed)
2
technerd

Was bedeutet "Diese Methode soll eine URL-Komponente oder eine Unterkomponentenzeichenfolge in Prozent kodieren, NICHT eine gesamte URL-Zeichenfolge." ? - GeneCode 1. September 16 um 08:30 Uhr 

Es bedeutet, dass Sie nicht den https://xpto.example.com/path/subpath der URL kodieren sollen, sondern nur das, was nach dem ? geht.

Angenommen, weil es Anwendungsfälle gibt, um dies in folgenden Fällen zu tun:

https://example.com?redirectme=xxxxx

Dabei ist xxxxx eine vollständig codierte URL.

1
kindaian

Hinzufügen der akzeptierten Antwort . Berücksichtigen Sie diese Anmerkung

Diese Methode soll eine URL-Komponente oder eine Unterkomponentenzeichenfolge in Prozent kodieren, NICHT eine gesamte URL-Zeichenfolge.

die gesamte URL sollte nicht codiert sein:

let param = "=color:green|\(latitude),\(longitude)&\("zoom=13&size=\(width)x\(height)")&sensor=true&key=\(staticMapKey)".addingPercentEncoding(withAllowedCharacters: .urlHostAllowed) 
let url = "https://maps.google.com/maps/api/staticmap?markers" + param!
0
Ayman Ibrahim