NSString转NSURL失败的解决办法
-
URL
支持26个英文字母、数字和少数几个特殊字符,因此,对于URL
中包含非标准URL
的字符时,就需要对其进行编码。 -
iOS
中提供了函数stringByAddingPercentEscapesUsingEncoding
对中文和一些特殊字符(下面已证实包含"%")进行编码,但是stringByAddingPercentEscapesUsingEncoding
的功能并不完善,对一些较为特殊的字符无效,或者说对一些我不想编码的字符编码,而对这些字符则可以使用CFURLCreateStringByteAddingPercentEscapes
函数. - 其中
NSString
的stringByAddingPercentEscapesUsingEncoding
方法,可以很容易的将url
中的中文进行编码,但是如果字符串中包含特殊符号,有可能转换失败,例如:
NSString *urlStr =
@"http://7xoztu.media1.z0.glb.clouddn.com/%E7%8C%9C%E7%8C%9C%E6%88%91%E6%9C%89%E5%A4%9Aai%E4%BD%A0%20-%20%E9%93%83%E5%A3%B0.mp3";
NSString *url =
[urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
但是当字符串中存在字符"%"时,使用上面的方法,会默认也进行"%"的编码,于是就造成了访问错误.对一些特定的字符串进行处理时应该换一种方法CFURLCreateStringByAddingPercentEscapes
,参数含义如下面的
CFStringRef CFURLCreateStringByAddingPercentEscapes(
CFAllocatorRef allocator,
CFStringRef originalString, /*待转码的字符串*/
CFStringRef charactersToLeaveUnescaped, /*指示不转义的字符*/
CFStringRef legalURLCharactersToBeEscaped,/*指示确定转义的字符*/
CFStringEncoding encoding); /*编码类型*/
如果同样需要对上面的urlStr进行编码,但是指定字符"%"不处理,对了,这个方法默认也是对字符"%"进行编码的,使用方法参考下面的
NSString *url = CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)(urlStr), (CFStringRef)@"%", NULL, kCFStringEncodingUTF8));