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 "#%/:<>?@[/]^`