2009-04-01 2 views

ответ

-2

В URL-адресе амперсанд является защищенным ключевым словом, означающим включение переменной querystring. Вы не можете поместить его как часть самого значения. Вам нужно изменить его на что-то другое.

Вот ссылка на тот же вопрос, заданный на StackOverflow: ASP.Net URLEncode Ampersand for use in Query String

+0

Это точно правильный ответ (по ссылке). –

+5

... за исключением неправильной структуры. Нет .NET на iPhone. –

4

Используйте% 26, как URL-адрес побега.

Другие ускользает:

$ %24 
& %26 
+ %2B 
, %2C 
/%2F 
: %3A 
; %3B 
= %3D 
? %3F 
@ %40 
+0

Так что если я делаю следующее я прав [statusTextField.text stringByReplacingOccurrencesOfString: @ «и» withString: @ «% 26»] и на моей стороне сервера я заменяю% 26 с & и хранить в БД. – 2009-04-01 14:19:58

31

-stringByAddingPercentEscapesUsingEncoding: не выполняет полную кодировку побег. Вы должны вручную добавить кодировки, используя -replaceOccurrencesOfString:withString:

Полный список (зеркальный список Gamecat), как первоначально было предложено на https://devforums.apple.com/message/15674#15674. Как указывает Ник, это дорого, поэтому просто не включайте полный список, не учитывая ваши реальные требования к экранированию.

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]; 

Этот код, безусловно, делает хэш вашего URL.

+8

Я считаю, что правильный код будет больше похож на NSMutableString * escaped = [NSMutableString stringWithString: [actionString ...]]; и NSMakeRange (0, [escaped length])] вместо цельной строки. – kolinko

+0

Сделайте мой день .. THANKS –

+1

Это довольно дорого, CFURLCreateStringByAddingPercentEscapes() лучше. –

36

Или еще короче:

@implementation NSString (Escaping) 
- (NSString*)stringWithPercentEscape {    
    return [(NSString *) CFURLCreateStringByAddingPercentEscapes(
     NULL, 
     (CFStringRef)[[self mutableCopy] autorelease], 
     NULL, 
     CFSTR("=,!$&'()*+;@?\n\"<>#\t :/"), 
     kCFStringEncodingUTF8) autorelease]; 
} 
@end 

И здесь снова, как соответствовать функции помощника инлайн ARC:

#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 
+2

Короче и страшнее :) – bentford

+0

См. Ответ Роджера ниже. Хотя это решение является хорошим общим ответом, это не полная реализация кодировки URL-адресов, как iOS версии 2.2. Если у кого-то есть дополнительная информация об этом, исправленном в последних версиях iOS, прокомментируйте здесь. – memmons

+1

Почему вы mutableCopy это? – user102008

0

stringByAddingPercentEscapesUsingEncoding также не работает должным образом с +.

Вот простое решение:

[[[urlString stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding] stringByReplacingOccurrencesOfString:@"&" withString:@"%26"] stringByReplacingOccurrencesOfString:@"+" withString:@"%2b"]; 
Смежные вопросы