organizacion imprimir generador cómo código crear codigo ios objective-c iphone ipad nsstring

ios - imprimir - ¿Cómo codigo una URL en una cadena?



un codigo (21)

Tengo una cadena de URL ( NSString ) con espacios y & caracteres. ¿Cómo puedo codificar en la URL toda la cadena (incluido el carácter & amp; y los espacios)?


// Esto es sin prueba

NSMutableCharacterSet* set = [[NSCharacterSet alphanumericCharacterSet] mutableCopy]; [set addCharactersInString:@"-_.~"]; NSString *encode = [test stringByAddingPercentEncodingWithAllowedCharacters:set];


Aquí hay un enfoque flexible listo para la producción en Swift 4 :

public extension CharacterSet { public static let urlQueryParameterAllowed = CharacterSet.urlQueryAllowed.subtracting(CharacterSet(charactersIn: "&?")) public static let urlQueryDenied = CharacterSet.urlQueryAllowed.inverted() public static let urlQueryKeyValueDenied = CharacterSet.urlQueryParameterAllowed.inverted() public static let urlPathDenied = CharacterSet.urlPathAllowed.inverted() public static let urlFragmentDenied = CharacterSet.urlFragmentAllowed.inverted() public static let urlHostDenied = CharacterSet.urlHostAllowed.inverted() public static let urlDenied = CharacterSet.urlQueryDenied .union(.urlQueryKeyValueDenied) .union(.urlPathDenied) .union(.urlFragmentDenied) .union(.urlHostDenied) public func inverted() -> CharacterSet { var copy = self copy.invert() return copy } } public extension String { func urlEncoded(denying deniedCharacters: CharacterSet = .urlDenied) -> String? { return addingPercentEncoding(withAllowedCharacters: deniedCharacters.inverted()) } }

Ejemplo de uso:

print("Hello, World!".urlEncoded()!) print("You&Me?".urlEncoded()!) print("#Blessed 100%".urlEncoded()!) print("Pride and Prejudice".urlEncoded(denying: .uppercaseLetters)!)

Salida:

Hello,%20World! You%26Me%3F %23Blessed%20100%25 %50ride and %50rejudice


Desafortunadamente, stringByAddingPercentEscapesUsingEncoding no siempre funciona al 100%. Codifica caracteres que no son URL pero deja solos los caracteres reservados (como barra diagonal / y sierra y & ). Aparentemente, este es un error que Apple conoce, pero como aún no lo han solucionado, he estado usando esta categoría para codificar en url una cadena:

@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:

Objective-c iPhone por ciento codifica una cadena?
Objective-C y codificación Swift URL

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/


Después de leer todas las respuestas para este tema y el aceptado ( incorrecto ), quiero agregar mi contribución.

SI el objetivo es iOS7 +, y en 2017, debido a que XCode hace que sea realmente difícil ofrecer compatibilidad bajo iOS8, la mejor manera, seguro para hilos, rápido, y amd será compatible con UTF-8 para hacer esto:

(Código objetivo C)

@implementation NSString (NSString_urlencoding) - (NSString *)urlencode { static NSMutableCharacterSet *chars = nil; static dispatch_once_t pred; if (chars) return [self stringByAddingPercentEncodingWithAllowedCharacters:chars]; // to be thread safe dispatch_once(&pred, ^{ chars = NSCharacterSet.URLQueryAllowedCharacterSet.mutableCopy; [chars removeCharactersInString:@"!*''();:@&=+$,/?%#[]"]; }); return [self stringByAddingPercentEncodingWithAllowedCharacters:chars]; } @end

Esto extenderá NSString, excluirá caracteres prohibidos RFC, admitirá caracteres UTF-8 y le permitirá usar cosas como:

NSString *myusername = "I''m[evil]&want(to)break!!!$->àéìòù"; NSLog(@"Source: %@ -> Dest: %@", myusername, [myusername urlencode]);

Eso se imprimirá en su consola de depuración:

Fuente: ¡Soy [malvado] y quiero (romper)! $ -> àéìòù -> Destino: I% 27m% 5Poema% 5D% 26vivo% 28to% 29break% 21% 21% 21% 24-% 3E% C3 % A0% C3% A9% C3% AC% C3% B2% C3% B9

... tenga en cuenta también el uso de dispatch_once para evitar inicializaciones múltiples en entornos multiproceso.


Ejemplo Swift 2.0 (iOS 9 Compatiable)

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


El consejo de Apple, en las notas de la versión 10.11, es:

Si necesita codificar porcentualmente una cadena URL completa, puede usar este código para codificar un NSString destinado a ser una URL (en urlStringToEncode):

NSString *percentEncodedURLString = [[NSURL URLWithDataRepresentation:[urlStringToEncode dataUsingEncoding:NSUTF8StringEncoding] relativeToURL:nil] relativeString];


En Swift 3 , pruebe a continuación:

let stringURL = "YOUR URL TO BE ENCODE"; let encodedURLString = stringURL.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed) print(encodedURLString)

Dado que, stringByAddingPercentEscapesUsingEncoding codifica caracteres que no son URL pero deja los caracteres reservados (como !*''();:@&=+$,/?%#[] stringByAddingPercentEscapesUsingEncoding !*''();:@&=+$,/?%#[] ), Puede codificar la URL como en el siguiente código:

let stringURL = "YOUR URL TO BE ENCODE"; let characterSetTobeAllowed = (CharacterSet(charactersIn: "!*''();:@&=+$,/?%#[] ").inverted) if let encodedURLString = stringURL.addingPercentEncoding(withAllowedCharacters: characterSetTobeAllowed) { print(encodedURLString) }


En mi caso, donde el último componente era árabe, hice lo siguiente en 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; } }

uso:

let stringURL = "http://xxx.dev.com/endpoint/nonLatinCharacters" if let encodedStringURL = stringURL.encodeUTF8() { if let url = NSURL(string: encodedStringURL) { ... } }


En veloz 3:

// exclude alpha and numeric == "full" encoding stringUrl = stringUrl.addingPercentEncoding(withAllowedCharacters: .alphanumerics)!; // exclude hostname and symbols &,/ and etc stringUrl = stringUrl.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)!;


Este código me ayudó a codificar caracteres especiales

NSString* encPassword = [password stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet alphanumericCharacterSet]];


Este está trabajando para mí.

func stringByAddingPercentEncodingForFormData(plusForSpace: Bool=false) -> String? { let unreserved = "*-._" let allowed = NSMutableCharacterSet.alphanumericCharacterSet() allowed.addCharactersInString(unreserved) if plusForSpace { allowed.addCharactersInString(" ") } var encoded = stringByAddingPercentEncodingWithAllowedCharacters(allowed) if plusForSpace { encoded = encoded?.stringByReplacingOccurrencesOfString(" ", withString: "+") } return encoded }

Encontré la función anterior de este enlace: http://useyourloaf.com/blog/how-to-percent-encode-a-url-string/

También puede usar esta función con una extensión rápida. Por favor, avíseme si hay algún problema.


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 conjunto de caracteres permitido según el requisito del componente URL.


Intente utilizar el método stringByAddingPercentEncodingWithAllowedCharacters con [NSCharacterSet URLUserAllowedCharacterSet] cubrirá todos los casos

C objetivo

NSString *value = @"Test / Test"; value = [value stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLUserAllowedCharacterSet]];

rápido

var value = "Test / Test" value.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLUserAllowedCharacterSet())

Salida

Test%20%2F%20Test


Me enfrenté a un problema similar al pasar cadenas complejas como un parámetro POST. Mis cadenas pueden contener caracteres asiáticos, espacios, citas y todo tipo de caracteres especiales. La solución que finalmente encontré fue convertir mi cadena en la serie correspondiente de unicodes, por ejemplo, "Hu0040Hu0020Hu03f5 ...." usando [NSString stringWithFormat: @ "Hu% 04x", [string characterAtIndex: i]] para obtener el Unicode de cada uno personaje en la cadena original. Lo mismo se puede hacer en Java.

Esta cadena se puede pasar con seguridad como un parámetro POST.

En el lado del servidor (PHP), cambio toda la "H" a "/" y paso la cadena resultante a json_decode. El paso final es escapar de comillas simples antes de almacenar la cadena en MySQL.

De esta forma puedo almacenar cualquier cadena UTF8 en mi servidor.


Opté por usar la llamada CFURLCreateStringByAddingPercentEscapes como se indica en la respuesta aceptada; sin embargo, en la versión más reciente de XCode (y IOS), se produjo un error, por lo que usé lo siguiente:

NSString *apiKeyRaw = @"79b|7Qd.jW=])(fv|M&W0O|3CENnrbNh4}2E|-)J*BCjCMrWy%dSfGs#A6N38Fo~"; NSString *apiKey = (NSString *)CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(NULL, (CFStringRef)apiKeyRaw, NULL, (CFStringRef)@"!*''();:@&=+$,/?%#[]", kCFStringEncodingUTF8));


Para los parámetros de consulta individuales con codificación www, hice una categoría en NSString:

- (NSString*)WWWFormEncoded{ NSMutableCharacterSet *chars = NSCharacterSet.alphanumericCharacterSet.mutableCopy; [chars addCharactersInString:@" "]; NSString* encodedString = [self stringByAddingPercentEncodingWithAllowedCharacters:chars]; encodedString = [encodedString stringByReplacingOccurrencesOfString:@" " withString:@"+"]; return encodedString; }


Se han agregado nuevas API desde que se seleccionó la respuesta; Ahora puede usar NSURLUtilities. Dado que diferentes partes de las URL permiten diferentes caracteres, use el juego de caracteres aplicable. 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 usar 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];


Use NSURLComponents para codificar los parámetros HTTP GET:

var urlComponents = NSURLComponents(string: "https://www.google.de/maps/")! urlComponents.queryItems = [ NSURLQueryItem(name: "q", value: String(51.500833)+","+String(-0.141944)), NSURLQueryItem(name: "z", value: String(6)) ] urlComponents.URL // returns https://www.google.de/maps/?q=51.500833,-0.141944&z=6

http://www.ralfebert.de/snippets/ios/encoding-nsurl-get-parameters/


actualización de ios 7

NSString *encode = [string stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]]; NSString *decode = [encode stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];


código rápido basado en la respuesta objc de en este hilo.

extension String { func urlEncode() -> String { return CFURLCreateStringByAddingPercentEscapes( nil, self, nil, "!*''();:@&=+$,/?%#[]", CFStringBuiltInEncodings.UTF8.rawValue ) } }


-(NSString *)encodeUrlString:(NSString *)string { return CFBridgingRelease( CFURLCreateStringByAddingPercentEscapes( kCFAllocatorDefault, (__bridge CFStringRef)string, NULL, CFSTR("!*''();:@&=+$,/?%#[]"), kCFStringEncodingUTF8) ); }

según el siguiente blog