Create an account

Very important

  • To access the important data of the forums, you must be active in each forum and especially in the leaks and database leaks section, send data and after sending the data and activity, data and important content will be opened and visible for you.
  • You will only see chat messages from people who are at or below your level.
  • More than 500,000 database leaks and millions of account leaks are waiting for you, so access and view with more activity.
  • Many important data are inactive and inaccessible for you, so open them with activity. (This will be done automatically)


Thread Rating:
  • 215 Vote(s) - 3.6 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Replacement for stringByAddingPercentEscapesUsingEncoding in ios9?

#1
In iOS8 and prior I can use:

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

in iOS9 `stringByAddingPercentEscapesUsingEncoding` has been replaced with `stringByAddingPercentEncodingWithAllowedCharacters`:

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

and my question is: where to find needed `NSCharacterSet` (`NSUTF8StringEncoding`) for proper replacement of `stringByAddingPercentEscapesUsingEncoding`?
Reply

#2
For Objective-C:

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

where to find set for NSUTF8StringEncoding?

There are predefined character sets for the six URL components and subcomponents which allow percent encoding. These character sets are passed to `-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



The deprecation message says (emphasis mine):

> Use stringByAddingPercentEncodingWithAllowedCharacters(_:) instead, **which always uses the recommended UTF-8 encoding**, and which encodes for a specific URL component or subcomponent since each URL component or subcomponent has different rules for what characters are valid.

So you only need to supply an adequate `NSCharacterSet` as argument. Luckily, for URLs there's a very handy class method called `URLHostAllowedCharacterSet` that you can use like this:

NSCharacterSet *set = [NSCharacterSet URLHostAllowedCharacterSet];

Be aware, though, that:

> This method is intended to percent-encode an URL component or subcomponent string, NOT an entire URL string.
Reply

#3
`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;
}
}
Reply

#4
The deprecation message says (emphasis mine):

> Use stringByAddingPercentEncodingWithAllowedCharacters(_:) instead, **which always uses the recommended UTF-8 encoding**, and which encodes for a specific URL component or subcomponent since each URL component or subcomponent has different rules for what characters are valid.

So you only need to supply an adequate `NSCharacterSet` as argument. Luckily, for URLs there's a very handy class method called `URLHostAllowedCharacterSet` that you can use like this:

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

Update for *Swift 3* -- the method becomes the static property `urlHostAllowed`:

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

Be aware, though, that:

> This method is intended to percent-encode an URL component or subcomponent string, NOT an entire URL string.
Reply

#5
For Swift 3.0

You can use `urlHostAllowed` characterSet.

> /// Returns the character set for characters allowed in a host URL subcomponent.


public static var urlHostAllowed: CharacterSet { get }

WebserviceCalls.getParamValueStringForURLFromDictionary(settingsDict as! Dictionary<String, AnyObject>).addingPercentEncoding(withAllowedCharacters: CharacterSet.urlHostAllowed)
Reply

#6
Objective-C

this code work for me :

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

#7
> What is the meaning of "This method is intended to percent-encode an URL component or subcomponent string, NOT an entire URL string." ? – GeneCode Sep 1 '16 at 8:30

It means that you are not supposed to encode the `https://xpto.example.com/path/subpath` of the url, but only what goes after the `?`.

Supposed, because there are use-cases for doing it in cases like:

[To see links please register here]

?redirectme=xxxxx

Where `xxxxx` is a fully encoded URL.



Reply

#8
`URLHostAllowedCharacterSet` is **NOT WORKING** FOR ME. I use `URLFragmentAllowedCharacterSet` instead.

**OBJECTIVE -C**

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

**SWIFT - 4**

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

The following are useful (inverted) character sets:

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

#9
Adding to the accepted answer.
Taking into consideration this note

> This method is intended to percent-encode an URL component or subcomponent string, NOT an entire URL string.

the whole URL should not be encoded:

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!
Reply



Forum Jump:


Users browsing this thread:
1 Guest(s)

©0Day  2016 - 2023 | All Rights Reserved.  Made with    for the community. Connected through