iOS: Проблема с амперсандом в строке URL

Это код в php, основанный на ваших кодах:

<?php   
        $x = 3;
        $dimension = (2 * $x) -1 ;  
        $center = floor($dimension/2); 
        for($i = 1; $i <= $dimension; $i++)
        {
            for($j = 1; $j <= $dimension; $j++)
            { 
                $dist = ($center - $i) * ($center - $i) + ($center - $j) * ($center - $j);
                $result = floor(sqrt($dist)) + 1; 
                echo "(" . $i . ", " . $j . ")" . " = " . $result . "</br>";                
            }       
        }
    ?>

Он не дает мне тот же результат, что и вывод.

23
задан Cœur 14 January 2019 в 02:14
поделиться

4 ответа

-stringByAddingPercentEscapesUsingEncoding: не выполняет полное кодирование Escape. Необходимо вручную добавить использование кодировки -replaceOccurrencesOfString:withString:

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

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.

32
ответ дан 29 November 2019 в 00:57
поделиться

Используйте %26 в качестве Escape URL.

Другие Escape:

$  %24
&  %26
+  %2B
,  %2C
/  %2F
:  %3A
;  %3B
=  %3D
?  %3F
@  %40
4
ответ дан 29 November 2019 в 00:57
поделиться

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

Вот ссылка на тот же вопрос, который задают на StackOverflow: ASP.NET Амперсанд URLEncode для использования в Строке запроса

-2
ответ дан 29 November 2019 в 00:57
поделиться

Или даже короче:

@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
36
ответ дан 29 November 2019 в 00:57
поделиться