¿Cómo codifico en URL una cadena?
Tengo una cadena de URL ( NSString
) con espacios y &
caracteres. ¿Cómo codifico en URL toda la cadena (incluidos el &
carácter comercial y los espacios)?
Desafortunadamente, stringByAddingPercentEscapesUsingEncoding
no siempre funciona al 100%. Codifica caracteres que no son URL pero deja los caracteres reservados (como barra diagonal /
y signo comercial &
) solo. Aparentemente, este es un error que Apple conoce, pero como aún no lo han solucionado, he estado usando esta categoría para codificar una cadena mediante URL:
@implementation NSString (NSString_Extended)
- (NSString *)urlencode {
NSMutableString *output = [NSMutableString string];
const unsigned char *source = (const unsigned char *)[self UTF8String];
int sourceLen = strlen((const char *)source);
for (int i = 0; i < sourceLen; ++i) {
const unsigned char thisChar = source[i];
if (thisChar == ' '){
[output appendString:@"+"];
} else if (thisChar == '.' || thisChar == '-' || thisChar == '_' || thisChar == '~' ||
(thisChar >= 'a' && thisChar <= 'z') ||
(thisChar >= 'A' && thisChar <= 'Z') ||
(thisChar >= '0' && thisChar <= '9')) {
[output appendFormat:@"%c", thisChar];
} else {
[output appendFormat:@"%%%02X", thisChar];
}
}
return output;
}
Usado así:
NSString *urlEncodedString = [@"SOME_URL_GOES_HERE" urlencode];
// Or, with an already existing string:
NSString *someUrlString = @"someURL";
NSString *encodedUrlStr = [someUrlString urlencode];
Esto también funciona:
NSString *encodedString = (NSString *)CFURLCreateStringByAddingPercentEscapes(
NULL,
(CFStringRef)unencodedString,
NULL,
(CFStringRef)@"!*'();:@&=+$,/?%#[]",
kCFStringEncodingUTF8 );
Algunas buenas lecturas sobre el tema:
¿El porcentaje de iPhone Objective-c codifica una cadena?
Codificación de URL Objective-C y Swift
http://cybersam.com/programming/proper-url-percent-encoding-in-ios
https://devforums.apple.com/message/15674#15674
http://simonwoodside.com/weblog/2009/4/ 22/how_to_really_url_encode/
Esto podría ser útil
NSString *sampleUrl = @"http://www.google.com/search.jsp?params=Java Developer";
NSString* encodedUrl = [sampleUrl stringByAddingPercentEscapesUsingEncoding:
NSUTF8StringEncoding];
Para iOS 7+, la forma recomendada es:
NSString* encodedUrl = [sampleUrl stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
Puede elegir el juego de caracteres permitido según los requisitos del componente URL.
Se agregaron nuevas API desde que se seleccionó la respuesta; Ahora puede utilizar NSURLUtilities. Dado que diferentes partes de las URL permiten caracteres diferentes, utilice el juego de caracteres correspondiente. El siguiente ejemplo codifica para su inclusión en la cadena de consulta:
encodedString = [myString stringByAddingPercentEncodingWithAllowedCharacters:NSCharacterSet.URLQueryAllowedCharacterSet];
Para convertir '&' específicamente, deberá eliminarlo del conjunto de consultas de URL o utilizar un conjunto diferente, ya que '&' está permitido en una consulta de URL:
NSMutableCharacterSet *chars = NSCharacterSet.URLQueryAllowedCharacterSet.mutableCopy;
[chars removeCharactersInRange:NSMakeRange('&', 1)]; // %26
encodedString = [myString stringByAddingPercentEncodingWithAllowedCharacters:chars];
Ejemplo de Swift 2.0 (compatible con iOS 9)
extension String {
func stringByURLEncoding() -> String? {
let characters = NSCharacterSet.URLQueryAllowedCharacterSet().mutableCopy() as! NSMutableCharacterSet
characters.removeCharactersInString("&")
guard let encodedString = self.stringByAddingPercentEncodingWithAllowedCharacters(characters) else {
return nil
}
return encodedString
}
}