iOS:URL字符串中的与号有问题
如何在URL中传递字符串Mr.X和Mr.Y 我试过这个,但这一个除了符号外,其他字符都用iOS:URL字符串中的与号有问题,ios,objective-c,nsurl,Ios,Objective C,Nsurl,如何在URL中传递字符串Mr.X和Mr.Y 我试过这个,但这一个除了符号外,其他字符都用 [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding] 在URL中,符号AND是受保护的关键字,表示包含querystring变量。不能将其作为值本身的一部分放入。你需要把它换成别的东西 这里有一个链接,指向StackOverflow上提出的相同问题:使用%26作为url转义 其他逃逸: $ %24 &
[urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]
在URL中,符号AND是受保护的关键字,表示包含querystring变量。不能将其作为值本身的一部分放入。你需要把它换成别的东西 这里有一个链接,指向StackOverflow上提出的相同问题:使用%26作为url转义 其他逃逸:
$ %24
& %26
+ %2B
, %2C
/ %2F
: %3A
; %3B
= %3D
? %3F
@ %40
-stringByAddingPercentEscapesUsingEncoding:
不执行完整的转义编码。您应该使用-replaceCurrencesofString:withString:
下面是一个完整的列表(镜像Gamecat的列表),正如最初在中建议的那样。正如尼克指出的,这是昂贵的,所以不要简单地列出完整的清单,而不考虑你逃跑的真正要求
NSMutableString *escaped = [actionString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
[escaped replaceOccurrencesOfString:@"$" withString:@"%24" options:NSCaseInsensitiveSearch range:wholeString];
[escaped replaceOccurrencesOfString:@"&" withString:@"%26" options:NSCaseInsensitiveSearch range:wholeString];
[escaped replaceOccurrencesOfString:@"+" withString:@"%2B" options:NSCaseInsensitiveSearch range:wholeString];
[escaped replaceOccurrencesOfString:@"," withString:@"%2C" options:NSCaseInsensitiveSearch range:wholeString];
[escaped replaceOccurrencesOfString:@"/" withString:@"%2F" options:NSCaseInsensitiveSearch range:wholeString];
[escaped replaceOccurrencesOfString:@":" withString:@"%3A" options:NSCaseInsensitiveSearch range:wholeString];
[escaped replaceOccurrencesOfString:@";" withString:@"%3B" options:NSCaseInsensitiveSearch range:wholeString];
[escaped replaceOccurrencesOfString:@"=" withString:@"%3D" options:NSCaseInsensitiveSearch range:wholeString];
[escaped replaceOccurrencesOfString:@"?" withString:@"%3F" options:NSCaseInsensitiveSearch range:wholeString];
[escaped replaceOccurrencesOfString:@"@" withString:@"%40" options:NSCaseInsensitiveSearch range:wholeString];
[escaped replaceOccurrencesOfString:@" " withString:@"%20" options:NSCaseInsensitiveSearch range:wholeString];
[escaped replaceOccurrencesOfString:@"\t" withString:@"%09" options:NSCaseInsensitiveSearch range:wholeString];
[escaped replaceOccurrencesOfString:@"#" withString:@"%23" options:NSCaseInsensitiveSearch range:wholeString];
[escaped replaceOccurrencesOfString:@"<" withString:@"%3C" options:NSCaseInsensitiveSearch range:wholeString];
[escaped replaceOccurrencesOfString:@">" withString:@"%3E" options:NSCaseInsensitiveSearch range:wholeString];
[escaped replaceOccurrencesOfString:@"\"" withString:@"%22" options:NSCaseInsensitiveSearch range:wholeString];
[escaped replaceOccurrencesOfString:@"\n" withString:@"%0A" options:NSCaseInsensitiveSearch range:wholeString];
NSMutableString*escaped=[actionString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
[转义替换发生率字符串:@“$”和字符串:@“%24”选项:NSCaseInsensitiveSearch范围:整字符串];
[转义替换发生率字符串:@“&”带字符串:@“%26”选项:NSCaseInsensitiveSearch范围:整字符串];
[转义替换发生率字符串:@“+”带字符串:@“%2B”选项:NSCaseInsensitiveSearch范围:整字符串];
[转义替换发生率字符串:@”,“带字符串:@“%2C”选项:NSCaseInsensitiveSearch范围:整字符串];
[转义替换发生率字符串:@”/“带字符串:@”%2F“选项:NSCaseInsensitiveSearch范围:整字符串];
[转义替换发生率字符串:@:“带字符串:@”%3A“选项:NSCaseInsensitiveSearch范围:整字符串];
[转义的替换发生率字符串:@;“带字符串:@”%3B“选项:NSCaseInsensitiveSearch范围:整字符串];
[转义替换发生率字符串:@“=”带字符串:@“%3D”选项:NSCaseInsensitiveSearch范围:整字符串];
[转义替换发生率字符串:@”?“带字符串:@“%3F”选项:NSCaseInsensitiveSearch范围:整字符串];
[转义替换发生率字符串:@“@”和字符串:@“%40”选项:NSCaseInsensitiveSearch范围:整字符串];
[已转义的替换发生率字符串:@”“带字符串:@“%20”选项:NSCaseInsensitiveSearch范围:整字符串];
[转义替换发生率字符串:@“\t”和字符串:@“%09”选项:NSCaseInsensitiveSearch范围:整字符串];
[转义替换发生率字符串:@“#”和字符串:@“%23”选项:NSCaseInsensitiveSearch范围:整字符串];
[转义的替换发生率字符串:@”“带字符串:@“%3E”选项:NSCaseInsensitiveSearch范围:整字符串];
[转义替换发生率字符串:@“\”,带字符串:@“%22”选项:NSCaseInsensitiveSearch范围:整字符串];
[转义替换发生率字符串:@“\n”和字符串:@“%0A”选项:NSCaseInsensitiveSearch范围:整字符串];
此代码肯定会对您的URL进行哈希处理。甚至更短:
@implementation NSString (Escaping)
- (NSString*)stringWithPercentEscape {
return [(NSString *) CFURLCreateStringByAddingPercentEscapes(
NULL,
(CFStringRef)[[self mutableCopy] autorelease],
NULL,
CFSTR("=,!$&'()*+;@?\n\"<>#\t :/"),
kCFStringEncodingUTF8) autorelease];
}
@end
@实现NSString(转义)
-(NSString*)stringWithPercentEscape{
返回[(NSString*)cfurlCreateStringByAddingPercents转义(
无效的
(CFStringRef)[[self-mutableCopy]自动释放],
无效的
CFSTR(“=,!$&'()*+;@?\n\“#\t:/”,
kCFStringEncodingUTF8)自动释放];
}
@结束
这里它又是一个符合圆弧的内联函数助手:
#if __has_feature(objc_arc)
static inline NSString *hxURLEscape(NSString *v) {
static CFStringRef _hxURLEscapeChars = CFSTR("=,!$&'()*+;@?\r\n\"<>#\t :/");
return ((__bridge_transfer NSString *)CFURLCreateStringByAddingPercentEscapes(
NULL,
(__bridge CFStringRef)[v mutableCopy],
NULL,
_hxURLEscapeChars,
kCFStringEncodingUTF8));
}
#endif
#如果"具有"功能(objc"弧)
静态内联NSString*hxURLEscape(NSString*v){
静态CFStringRef_hxURLEscapeChars=CFSTR(“=,!$&'()*+;@?\r\n\“#\t:/”;
返回((uu桥u传输NSString*)cfurlCreateStringByAddingPercents转义(
无效的
(uu桥CFStringRef)[v可变副本],
无效的
_hxURLEscapeChars,
kCFStringEncodingUTF8);
}
#恩迪夫
stringbyaddingpercentescapesusingencode
也不能正常使用+
下面是一个更简单的解决方案:
[[[urlString stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding] stringByReplacingOccurrencesOfString:@"&" withString:@"%26"] stringByReplacingOccurrencesOfString:@"+" withString:@"%2b"];
CFURLCreateStringByAddingPercentEscapes
已被弃用(自iOS9以来),因此,如何修改URLQueryAllowedCharacterSet以删除保留字符,从而使它们能够相对高效地进行百分比编码
- (NSString *)URLQueryValueEncodedString:(NSString *)string {
static NSMutableCharacterSet *_allowedCharacterSet = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSString *reservedCharacters = @"=,!$&'()*+;@?\r\n\"<>#\t :/[]%";
_allowedCharacterSet = [NSCharacterSet URLQueryAllowedCharacterSet].mutableCopy;
[_allowedCharacterSet removeCharactersInString:reservedCharacters];
});
return [string stringByAddingPercentEncodingWithAllowedCharacters:_allowedCharacterSet];
}
-(NSString*)URLQueryValueEncodedString:(NSString*)字符串{
静态NSMutableCharacterSet*_allowedCharacterSet=nil;
静态调度一次;
一次发送(一次发送)^{
NSString*reservedCharacters=@“=,!$&'()*+;@?\r\n\“\t:/[]%”;
_allowedCharacterSet=[NSCharacterSet URLQueryAllowedCharacterSet].mutableCopy;
[\u allowedCharacterSet removeCharactersInString:reservedCharacters];
});
返回[string stringByAddingPercentEncodingWithAllowedCharacters:_allowedCharacterSet];
}
因此,如果我执行以下操作,我是对的[statusTextField.text StringByReplacingOccurrence sofString:@“&”with String:@“%26”],在我的服务器端,我将%26替换为&并存储在数据库中。请参阅下面罗杰的回答。虽然这个解决方案是一个很好的通用答案,但从iOS版本2.2开始,它并不是一个完整的URL编码实现。如果任何人有任何关于在以后的iOS版本中修复此问题的其他信息,请在这里发表评论。事实上,我认为我们甚至不需要复制它,可以用self
替换[[self-mutableCopy]autorelease]
。有关此问题的更多详细信息,请参阅CFURLCreateStringByAddingPercentEscapes
关于此问题的好文章的文档。我相信正确的代码更像NSMutableString*Escape=[NSMutableString stringWithString:[actionString…];和NSMakeRange(0,[转义长度])而不是整串。这相当昂贵,CFURLCreateStringByAddingPercentEscapes()更好。CFURLCreateStringByAddingPercentEscapes是否与StringByAddingPercentEscapes使用Encoding存在相同的问题?