Reemploop para stringByAddingPercentEscapesUsingEncoding en ios9?

En iOS8 y antes, puedo usar:

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

en iOS9 stringByAddingPercentEscapesUsingEncoding ha sido reemplazado por stringByAddingPercentEncodingWithAllowedCharacters :

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

y mi pregunta es: ¿dónde encontrar NSCharacterSet ( NSUTF8StringEncoding ) necesario para la sustitución adecuada de stringByAddingPercentEscapesUsingEncoding ?

El post de desaprobación dice (énfasis mío):

Use stringByAddingPercentEncodingWithAllowedCharacters (_ 🙂 en su lugar, que siempre utiliza la encoding UTF-8 recomendada , y que codifica para un componente o subcomponente de URL específico ya que cada componente de URL o subcomponente tiene reglas diferentes para los caracteres que son válidos.

Por lo tanto, solo necesita proporcionar un argumento NSCharacterSet adecuado. Afortunadamente, para las URL hay un método de class muy útil llamado URLHostAllowedCharacterSet que puedes usar así:

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

Actualización para Swift 3 : el método se convierte en la propiedad estática urlHostAllowed :

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

Tenga en count, sin embargo, que:

Este método está destinado a codificar por ciento un componente de URL o una cadena de subcomponente, NO una cadena de URL completa.

Para Objective-C:

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

¿Dónde encontrar el set para NSUTF8StringEncoding?

Existen sets de caracteres pnetworkingefinidos para los seis componentes y subcomponentes de URL que permiten el porcentaje de encoding. Estos sets de caracteres se pasan a -stringByAddingPercentEncodingWithAllowedCharacters:

  // Pnetworkingefined 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 

El post de desaprobación dice (énfasis mío):

Use stringByAddingPercentEncodingWithAllowedCharacters (_ 🙂 en su lugar, que siempre utiliza la encoding UTF-8 recomendada , y que codifica para un componente o subcomponente de URL específico ya que cada componente de URL o subcomponente tiene reglas diferentes para los caracteres que son válidos.

Por lo tanto, solo necesita proporcionar un argumento NSCharacterSet adecuado. Afortunadamente, para las URL hay un método de class muy útil llamado URLHostAllowedCharacterSet que puedes usar así:

 NSCharacterSet *set = [NSCharacterSet URLHostAllowedCharacterSet]; 

Tenga en count, sin embargo, que:

Este método está destinado a codificar por ciento un componente de URL o una cadena de subcomponente, NO una cadena de URL completa.

C objective

este código funciona para mí:

 urlString = [urlString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLFragmentAllowedCharacterSet]]; 

URLHostAllowedCharacterSet NO ESTÁ TRABAJANDO PARA MÍ. Yo uso URLFragmentAllowedCharacterSet en URLFragmentAllowedCharacterSet lugar.

C OBJETIVO

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

Los siguientes son sets de caracteres útiles (invertidos):

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

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 networkinguce the array to String let lastComponentAsString = lastComponent.map { String($0) }.networkinguce("", 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; } } 

Para Swift 3.0

Puede usar urlHostAllowed characterSet.

/// Devuelve el set de caracteres para los caracteres permitidos en un subcomponente de URL de host.

 public static var urlHostAllowed: CharacterSet { get } WebserviceCalls.getParamValueStringForURLFromDictionary(settingsDict as! Dictionary<String, AnyObject>).addingPercentEncoding(withAllowedCharacters: CharacterSet.urlHostAllowed) 

¿Cuál es el significado de "Este método está destinado a codificar por ciento un componente de URL o una cadena de subcomponente, NO una cadena de URL completa". ? – GeneCode 1 de septiembre de 2016 a las 8:30

Significa que se supone que no debes codificar el https://xpto.example.com/path/subpath de la url, sino solo lo que va después de la ? .

Supuesto, porque hay casos de uso para hacerlo en casos como:

 https://example.com?networkingirectme=xxxxx 

Donde xxxxx es una URL totalmente codificada.

Intereting Posts