当访问某个服务器的的时候 需要用到NSURL 构建URL的时候路径其中可能包含中文或者一些像&……+¥等符号,但是我们知道如果不对其进行处理的话,访问时就会出问题:如http:/www.nihao.com?arguments=我是一名程序员&name=保密;
如何进行对这些中文进行处理:
首先要先介绍一个下CFURLCreateStringByAddingPercentEscapes 方法,该方法是Core Fundation框架中的方法
定义为:
CFStringRef CFURLCreateStringByAddingPercentEscapes(CFAllocatorRef allocator, CFStringRef originalString, CFStringRef charactersToLeaveUnescaped, CFStringRef legalURLCharactersToBeEscaped, CFStringEncoding encoding);
第一个参数是:CFAllocatorRef 不用深究,因为该参数一般默认为kCFAllocatorDefault;
第二个参数是:指的是你要编码的字符串(也就是我们说的URL):http:/www.nihao.com?arguments=我是一名程序员&name=保密
第三个参数是:指定在编码的URL中不需要编码的字符集;
第四个参数是:编码的字符串中需要编码的字符集;
第五个参数是:编码方式
为了说明问题直接上图片和代码
首先定义一个NSString 的类目(类别)主要是为了方便使用
#import "NSString+URLString.h"
@implementation NSString (URLString)
-(NSString *)encodingURLString
{
NSString *result=(NSString *)CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)self, (CFStringRef)@"", (CFStringRef)@"", kCFStringEncodingUTF8));
return result;
}
-(NSString *)decodingURLString{
NSString *result=CFBridgingRelease(CFURLCreateStringByReplacingPercentEscapesUsingEncoding
(kCFAllocatorDefault,
(CFStringRef)self,CFSTR(""),
kCFStringEncodingUTF8));
return result;
}
@end
NSString *path=[NSString stringWithFormat:@"http://webservice.webxml.com.cn/webservices/ChinaStockSmallImageWS.asmx/getSmallImage?theStockCode=234&theImageType=的身&/;][]份"];
NSURL *url=[NSURL URLWithString:[path encodingURLString]];//使用已经定义好的方法进行编码;
编码URL此时CFStringRef charactersToLeaveUnescaped,CFStringRef legalURLCharactersToBeEscaped这两个参数都为空字符串,说明没有特殊说明不被编码和被编码的符号和字符集;但是此方法会有默认编码和不被编码的字符集 ,设置断点查看url的值,如下图:
可以看到中文和][符号已经被编码;但是“;/”没有被编码
如果现在把CFStringRef charactersToLeaveUnescaped, 参数设成(CFStringRef)@“[]”; 再设置断点 查看url的值
可以看到" ]["符号已经显示出来
当我们把CFStringRef legalURLCharactersToBeEscaped 参数设置成 (CFStringRef)@“;/” ;再设置断点查看url的值会发现
会看到所有的 / 变成了 % 此时的URL 肯定不正确;
所以在指定 时一定要注意 指定的字符串集不能影响 URL 的正确性 比如一些 常见的敏感符号 & / : ? 等
- (NSString *)stringByAddingPercentEscapesUsingEncoding:(NSStringEncoding)enc;
此方法只有一个参数,所以说不能指定特定的符号,不是很灵活.如果CFURLCreateStringByAddingPercentEscapes 不设置特殊的字符集,两者效果大多数情况下编码的结果是一样的。
根据需要选择自己的方法才是最合适的!!!!!
如果有错请指正,-。-!!!~~~~~~~~~~~~~~