I would like to get the percent encoded string for these specific letters, how to do that in objective-c?
Reserved characters after percent-encoding
! * ' ( ) ; : @ & = + $ , / ? # [ ]
%21 %2A %27 %28 %29 %3B %3A %40 %26 %3D %2B %24 %2C %2F %3F %23 %5B %5D
Please test with this string and see if it do work:
myURL = @"someurl/somecontent"
I would like the string to look like:
myEncodedURL = @"someurl%2Fsomecontent"
I tried with the stringByAddingPercentEscapesUsingEncoding: NSASCIIStringEncoding
already but it does not work, the result is still the same as the original string. Please advice.
I've found that both
stringByAddingPercentEscapesUsingEncoding:
andCFURLCreateStringByAddingPercentEscapes()
are inadequate. TheNSString
method misses quite a few characters, and the CF function only lets you say which (specific) characters you want to escape. The proper specification is to escape all characters except a small set.To fix this, I created an
NSString
category method to properly encode a string. It will percent encoding everything EXCEPT[a-zA-Z0-9.-_~]
and will also encode spaces as+
(according to this specification). It will also properly handle encoding unicode characters.NSString's stringByAddingPercentEscapesUsingEncoding: looks like what you're after.EDIT: Here's an example using
CFURLCreateStringByAddingPercentEscapes
instead.originalString
can be either anNSString
or aCFStringRef
.Please note that this is untested. You should have a look at the documentation page to make sure you understand the memory allocation semantics for
CFStringRef
, the idea of toll-free bridging, and so on.Also, I don't know (off the top of my head) which of the characters specified in the
legalURLCharactersToBeEscaped
argument would have been escaped anyway (due to being illegal in URLs). You may want to check this, although it's perhaps better just to be on the safe side and directly specify the characters you want escaped.I'm making this answer a community wiki so that people with more knowledge about CoreFoundation can make improvements.
Before I noticed Rob's answer, which appears to work well and is preferred as it's cleaner, I went ahead and ported Dave's answer to Swift. I'll leave it here in case anyone is interested:
It won't replace your string inline; it'll return a new string. That's implied by the fact that the method starts with the word "string". It's a convenience method to instantiate a new instance of NSString based on the current NSString.
Note--that new string will be
autorelease
'd, so don't call release on it when you're done with it.In Swift4:
If you are using ASI HttpRequest library in your objective-c program, which I cannot recommend highly enough, then you can use the "encodeURL" helper API on its ASIFormDataRequest object. Unfortunately, the API is not static so maybe worth creating an extension using its implementation in your project.
The code, copied straight from the ASIFormDataRequest.m for encodeURL implementation, is:
As you can see, it is essentially a wrapper around
CFURLCreateStringByAddingPercentEscapes
that takes care of all the characters that should be properly escaped.