IOS使用CFURLCreateStringByAddingPercentEscapes进行URL编码



iOS程序访问HTTP资源时需要对URL进行UTF8编码,我在之前一直都喜欢使用NSString的stringByAddingPercentEscapesUsingEncoding方法进行编码。今天在使用Analyze分析工程时,提示下面的方法可能存在内存泄露:

NSString *enString =(NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)stringURL, NULL, NULL, kCFStringEncodingUTF8);

注意到这个方法也是一个编码方案,就查询了两种方式的区别,有些收获。额外学习UITabBarController隐藏tabBar以及addChildViewController

stringByAddingPercentEscapesUsingEncoding方法有一个问题:不会转转URL中的”%&?”等符号[这个很好理解,因为不好区分这些特殊字符到底是连接符号还是参数值]。这些字符在URL语法中有特殊的含义,如果在URL的参数中有这些字符,就需要转化为”%+ASCII”的形式。如果参数中存在这些字符,而我们又使用了stringByAddingPercentEscapesUsingEncoding方法,则服务器会将参数中的没有转义的&当做分隔符,造成分析错误。因为我的工程中几乎没有在参数中存在%&等符号的情况,所以一直用也没问题。但咱们还是要使用正规的方式。

一般来说都是用:

CFStringRef CFURLCreateStringByAddingPercentEscapes(
CFAllocatorRef allocator,
CFStringRef originalString, /*待转码的类型*/
CFStringRef charactersToLeaveUnescaped, /*指示不转义的字符*/
CFStringRef legalURLCharactersToBeEscaped,/*指示确定转义的字符*/
CFStringEncoding encoding); /*编码类型*/

1

2

3

4

5

6

CFStringRef
CFURLCreateStringByAddingPercentEscapes(

CFAllocatorRef allocator,

CFStringRef
originalString,
/*待转码的类型*/

CFStringRef charactersToLeaveUnescaped,
/*指示不转义的字符*/

CFStringRef
legalURLCharactersToBeEscaped,/*指示确定转义的字符*/

CFStringEncoding encoding);
/*编码类型*/

方案就是单独编码参数值(如果编码整个URL的话会讲URL分割符&等也编码),最后拼接成完整的字符串。

示例Demo如下:

CFStringRef escaped = CFURLCreateStringByAddingPercentEscapes(NULL, (CFStringRef)self, NULL, (CFStringRef)@"!*‘();:@&=+$,/?%#[]",kCFStringEncodingUTF8);
NSString *out = [NSString stringWithString:(NSString *)escaped];
CFRelease(escaped);//记得释放

1

2

3

CFStringRef
escaped =
CFURLCreateStringByAddingPercentEscapes(NULL,
(CFStringRef)self,
NULL,
(CFStringRef)@"!*‘();:@&=+$,/?%#[]",kCFStringEncodingUTF8);

NSString *out
= [NSString
stringWithString:(NSString *)escaped];

CFRelease(escaped);//记得释放

另外一个小知识点:

在之前做图片切割时经常用到如下代码

CGImageRef newImageRef = CGImageCreateWithImageInRect(sourceImageRef, rect);
UIImage *newImage = [UIImage imageWithCGImage:newImageRef];

1

2

CGImageRef
newImageRef =
CGImageCreateWithImageInRect(sourceImageRef,
rect);

UIImage *newImage
= [UIImage
imageWithCGImage:newImageRef];

实际上这个代码会造成内存泄露,正确的方式是还需要释放newImageRef,如下:

CGImageRef newImageRef = CGImageCreateWithImageInRect(sourceImageRef, rect);
UIImage *newImage = [UIImage imageWithCGImage:newImageRef];
CGImageRelease(newImageRef);

1

2

3

CGImageRef
newImageRef =
CGImageCreateWithImageInRect(sourceImageRef,
rect);

UIImage *newImage
= [UIImage
imageWithCGImage:newImageRef];

CGImageRelease(newImageRef);

时间: 2024-10-23 01:06:26

IOS使用CFURLCreateStringByAddingPercentEscapes进行URL编码的相关文章

[iOS]通过JS调用iOS函数时的URL编码问题

在前面的文章:[iOS]在WebApp中如何使用JS调用iOS的函数 中,提到了如何使用JS通过修改URL调用iOS的内部函数. 其中会遇到一个问题,就是编码问题,比如通过URL调用弹窗,在里面写上内容:你好汪海. 那链接大概就是这样的:http://xxx.com#ios?action=alert&param=你好汪海 但是在iOS中接收到的时候会出现中文的乱码: http://xxx.com#ios?action=alert&param=%25E6%2596%2587%25E4 遇到这

IOS URL 编码和解码

1.url编码 ios中http请求遇到汉字的时候,需要转化成UTF-8,用到的方法是: NSString * encodingString = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 2.url解码 请求后,返回的数据,如何显示的是这样的格式:%3A%2F%2F,此时需要我们进行UTF-8解码,用到的方法是: NSString *str = [model.album_name str

URL编码CFURLCreateStringByAddingPercentEscapes使用(ARC)

URL 编码:CFURLCreateStringByAddingPercentEscapes If you have tried to send any information using a GET web request, you would have come cross an annoying problem, That annoying problem is making sure that the URL is corrently encoded. The issue is that

iOS url 编码解码

1.url编码 ios中http请求遇到汉字的时候,需要转化成UTF-8,用到的方法是: NSString * encodingString = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 2.url解码 请求后,返回的数据,如何显示的是这样的格式:%3A%2F%2F,此时需要我们进行UTF-8解码,用到的方法是: NSString *str = [model.album_name str

【转】ios url 编码和解码

原文地址:http://www.cnblogs.com/hanjun/archive/2013/05/02/3054667.html 1.url编码 ios中http请求遇到汉字的时候,需要转化成UTF-8,用到的方法是: NSString * encodingString = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 2.url解码 请求后,返回的数据,如何显示的是这样的格式:%3A%

iOS下URL编码

使用NSString默认的URL编码,会对汉字等进行转义,但是对=+等这些字符不会进行转义 所以要手动实现这些字符的转义 - (NSString *)encodeToPercentEscapeString: (NSString *) input { // Encode all the reserved characters, per RFC 3986 // (<http://www.ietf.org/rfc/rfc3986.txt>) NSString *outputStr = (NSStri

[iOS]URL编码和解码

1. 首先来看下什么样的是URL编码(字符串中带有%22 类似这样的) NSString *str = @"http://m.tuniu.com/api/home/data/index/c/%7B%22v%22%3A%227.1.0%22%2C%22ct%22%3A20%2C%22dt%22%3A1%2C%22p%22%3A11210%2C%22cc%22%3A2500%7D/d/%7B%22clientModel%22%3A%22HONOR+H30-L01%22%2C%22width%22%3

URL编码

原链接在这里 Base64编码 所谓Base64,就是说选出64个字符----小写字母a-z.大写字母A-Z.数字0-9.符号"+"."/"(再加上作为垫字的"=",实际上是65个字符)----作为一个基本字符集.然后,其他所有符号都转换成这个字符集中的字符. 第一步,将每三个字节作为一组,一共是24个二进制位. 第二步,将这24个二进制位分为四组,每个组有6个二进制位. 第三步,在每组前面加两个00,扩展成32个二进制位,即四个字节. 第四步,

URL编码解码

ios url 编码和解码 1.url编码 ios中http请求遇到汉字的时候,需要转化成UTF-8,用到的方法是: NSString * encodingString = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 2.url解码 请求后,返回的数据,如何显示的是这样的格式:%3A%2F%2F,此时需要我们进行UTF-8解码,用到的方法是: NSString *str = [model.