根据RFC 2396标准,有些符号在URI中是不能直接传递的,如果要在URI中传递这些特殊符号,那么就要使用他们的编码,编码的格式为百分比编码:%加字符的ASCII码,即一个百分号%,后面跟对应字符的ASCII(16进制)码值。例如 空格的编码值是"%20"。
RFC 2396标准
允许的字符
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~:/?#[]@!$&'()*+,;=
根据RFC规范,URI中只可以包含以下特殊字符:
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~:/?#[]@!$&'()*+,;=
注意,这个列表没有说明这些字符在URI中的位置。任何其他字符都需要用百分比编码。URI的每个部分都对需要用百分比编码的字表示哪些字符有进一步的限制。
保留字符
/?#[]@
这是RFC 3986中定义的URI的泛型语法的一部分
!$&'()*+,;=
保留用于特定URI方案的语法组件
%
用于转义字符的编码
不需要任何编码的字符
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._~
RFC3986还指定了一些亚细亚字符,这些字符总是可以简单地用于表示数据,而不需要进行任何编码,而这些字符也正好是允许的字符除去保留字符。因此原则上,除了这些字符之外的字符都需要进行百分比转义。
禁止出现在URL中的字符
只剩下以下ASCII字符:禁出现在URL中:
控制字符(chars0-1F和7F),包括新行、选项卡和回车。
"<>^`{|}
因此需要转义的字符包括保留字符和禁止出现在URL的字符:
?!@#$^&%*+,:;='\"`<>()[]{}/\\|空格
// 来自网络,个人观点,这个是不全的,并没有包括控制字符,但是由于控制字符在
iOS中实现方案
/// 将除了不需要任何编码的字符之外所有的字符进行转义
+ (NSString *)encodedContentString:(NSString *)str {
NSString *charactersToEscape = @"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._~";
NSCharacterSet *allowedCharacters = [NSCharacterSet characterSetWithCharactersInString:charactersToEscape];
return [str stringByAddingPercentEncodingWithAllowedCharacters:allowedCharacters];
}
/// 这种方案,由于没有将控制字符进行转义,是不准确的(个人观点)
+ (NSString *)encodedContentString:(NSString *)str {
NSString *charactersToEscape = @"?!@#$^&%*+,:;='\"`<>()[]{}/\\| ";
NSCharacterSet *allowedCharacters = [[NSCharacterSet characterSetWithCharactersInString:charactersToEscape] invertedSet];
return [str stringByAddingPercentEncodingWithAllowedCharacters:allowedCharacters];
}