cfurlcreatestringbyaddingpercentescapes addingpercentencoding ios objective-c url encoding deprecated

ios - addingpercentencoding - url encode swift 4



Reemplazo para stringByAddingPercentEscapesUsingEncoding en ios9? (8)

¿Cuál es el significado de "Este método tiene la intención de codificar en porcentaje una cadena de componente o subcomponente de URL, NO una cadena de URL completa". ? - GeneCode Sep 1 ''16 a las 8:30

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

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

https://example.com?redirectme=xxxxx

Donde xxxxx es una URL totalmente codificada.

En iOS8 y versiones anteriores, 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 el NSCharacterSet ( NSUTF8StringEncoding ) necesario para el reemplazo adecuado de stringByAddingPercentEscapesUsingEncoding ?


Agregando a la respuesta aceptada. Teniendo en cuenta esta nota

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

la URL completa no debe estar codificada:

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!


C objetivo

este código me funciona:

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


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

Use stringByAddingPercentEncodingWithAllowedCharacters (_ :) en su lugar, que siempre usa la codificación UTF-8 recomendada y que codifica para un componente o subcomponente de URL específico ya que cada componente o subcomponente de URL tiene reglas diferentes para qué caracteres son válidos.

Por lo tanto, solo necesita proporcionar un NSCharacterSet adecuado como argumento. Afortunadamente, para las URL hay un método de clase 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 cuenta, sin embargo, que:

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


Para Swift 3.0

Puede usar urlHostAllowed characterSet.

/// Devuelve el conjunto 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)


Para el objetivo C:

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

¿Dónde encontrar el conjunto para NSUTF8StringEncoding?

Hay conjuntos de caracteres predefinidos para los seis componentes y subcomponentes de URL que permiten la codificación porcentual. Estos juegos de caracteres se pasan a -stringByAddingPercentEncodingWithAllowedCharacters:

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

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

Use stringByAddingPercentEncodingWithAllowedCharacters (_ :) en su lugar, que siempre usa la codificación UTF-8 recomendada y que codifica para un componente o subcomponente de URL específico ya que cada componente o subcomponente de URL tiene reglas diferentes para qué caracteres son válidos.

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

NSCharacterSet *set = [NSCharacterSet URLHostAllowedCharacterSet];

Tenga en cuenta, sin embargo, que:

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


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; } }


URLHostAllowedCharacterSet NO FUNCIONA PARA MÍ. Yo uso URLFragmentAllowedCharacterSet en URLFragmentAllowedCharacterSet lugar.

C OBJETIVO

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

SWIFT - 4

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

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

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