网络请求特殊字符处理问题

最近项目中,遇到这么一个奇怪的问题,当我给服务端发送一个含有%的字符串的时候,%竟然不见了

就比如说,我发送了一个%,后台获取到的数据为空,我发送%1,后台收到的是1,我发送%%%%,后台依旧收到的是空。

后来想到,之前有过显示“%”的问题,然后通过转义“%%”来实现了的,感觉应该是需要转义的,但是这个换做了%%%,无论多少个字符,依旧发过去的是空。查看了一下传递过去时候的数据,也是我想传输的数据啊,有点百思不得其解。

后来又搜了下,看到别人用NSURLConnection传输时候遇到了同样的问题,意思就是在发送请求的时候,如果url中含有特殊字符就会出现发送为空的情况。但是在发送之前对这些特殊符号做一次UTF8处理就可以解决了,否则这些字符就会为空显示,处理方法如下

(ARC)

NSString *baseStr = [imgData base64Encoding];  

NSString *baseString = (__bridge NSString *) CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,                                                          (CFStringRef)baseStr,

 NULL,                                                  

CFSTR(":/?#[]@!$&’()*+,;="),                                                 kCFStringEncodingUTF8); 

[urlRequest setHTTPBody:[baseString dataUsingEncoding:NSUTF8StringEncoding]];  


非ARC模式下,需要自己去手动释放

NSString*bodyStr =@"google+";

NSString*bStr =CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, 

                                                       (CFStringRef)bodyStr, 

                                                       NULL, 

                                               CFSTR(":/?#[]@!$&’()*+,;="), 

                                               kCFStringEncodingUTF8);

[urlRequest setHTTPBody:[bStr dataUsingEncoding:NSUTF8StringEncoding]];

[bStr release]

这样一来  问题就很完美的解决了


后来搜了下__bridge,不是很清晰,大意就是core foundation类型的和OC一些数据类型转换相关,

你可能感兴趣的:(IOS学习之路)