一、URL和URL编码
URL(统一资源定位器)是网页的地址。
URL编码:浏览器用来打包表单输入的格式。
URL特点:
1、URL只能使用ASCII字符集通过因特网传输。
2、URL不能包含空格。URL编码通常使用“+”来代替空格(个人认为还是%20更靠谱)。
URL编码特点:
1、URL编码就是用“%”后跟两位该字符所对应的十六进制数。比如?,其URL编码结果为:%3F。
2、URL编码使用“%”其后跟随两位十六进制数来替换非ASCII字符。比如中文;胡的URL编码结果为:%BA%FA。
3、对于ASCII字符中的所有字符URL都可以进行编码。比如A,URL编码结果为:%41。
实际的URL中,URL常常包含ASCII集合之外的字符(比如中文),因此URL必须转换为有效的ASCII格式。
二、URL转义(百分号转义)
URL转义其实就是对URL中的中文、空格及其不安全字符(歧义字符)的处理。而这个处理就是URL编码。
1、中文是非ASCII字符。因此若想成为URL的一部分在因特网传输,必须经过URL编码的处理。
2、空格显然也是URL所不允许的。必须经由URL编码处理。
3、不安全字符。比如“/”在URL中用于分割路径中的各个元素。若你不希望该斜线当作分隔符使用,而仅仅是当作一个斜杠,那么必须经过URL编码处理(结果为:%2F)。
温馨提示:
其实URL中除了必须转义的字符(中文、空格、不安全字符)外,其他的字符可转可不转。原因就是其他字符属于安全字符,不会出现歧义,得到错误的结果。当然,所有的字符都转义结果更是正确无误。
三、iOS中百分号转义方法
1、方法一
stringByAddingPercentEscapesUsingEncoding:
9.0以后过时。用stringByAddingPercentEscapesUsingEncodingWithAllowedCharcters代替。此方法的弊端在于它只对其中的14个字符可以编码。(目前具体14个确定与否,尚未实测)
14个可编码字符如下:'#%^{}[]|\"<>外加一个空格。
2、方法二
CFURLCreateStringByAddingPercentEscapes(CFAllocatorRef allocator, CFStringRef originalString, CFStringRef charactersToLeaveUnescaped, CFStringRef legalURLCharactersToBeEscaped, CFStringEncoding encoding)
9.0以后过时。用stringByAddingPercentEscapesUsingEncodingWithAllowedCharcters代替。
CFAllocatorRef allocator :默认为KCFAllocatorDefault。
CFStringRef originalSring :待转义的字符串
CFStringRef charactersToLeaveUnescaped :指定不需要转义的字符
CFStringRef legalURLCharactersToBeEscaped :指定需要转义的字符
CFStringEncoding encoding :编码类型(一般utf-8)
3、方法三
stringByAddingPercentEncodingWithAllowedCharacters:(NSCharacterSet *)allowedCharacters
9.0以后的新方法。推荐使用
allowedCharacters :指定的不需要被转义的字符集合。
方法使用:
NSCharacterSet *characterSet = [NSCharacterSet characterSetWithCharactersInString:@"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"];
NSString *result = [@"abcd+/0123" stringByAddingPercentEncodingWithAllowedCharacters:characterSet];
结果为 result=abcd%2B%2F0123。