URLEncoding строка с Objective C

Я пробую к URL, кодируют строку для формирования ПОЛУЧИТЬ запроса из цели-c.

NSString *params = @"'Decoded data!'/foo.bar:baz";

NSRunAlertPanel( @"Error", [params urlEncoded], @"OK", nil, nil );

Это - категория, расширяющая NSString

    -(NSString *) urlEncoded
{
    NSString *encoded = (NSString *)CFURLCreateStringByAddingPercentEscapes(
                                                   NULL,
                                                   (CFStringRef)self,
                                                   NULL,
                                                   (CFStringRef)@"!*'\"();:@&=+$,/?%#[]% ",
                                                   kCFStringEncodingUTF8 );
    return encoded;
}

Так в первый раз, когда я выполняю его, я возвращаюсь

1606410046ecoded          1606410784ata2270.000000foo.bar0X1.001716P-1042baz

от диалогового окна.

Сразу после того, как я выполняю его снова, я получаю это

1606410046ecoded          1606410944ata227369374562920703448982951250259562309742470533728899744288431318481119278377104028261651081181287077973859930826299575521579020410425419424562236383226511593137467590082636817579938932512039895040.000000foo.bar0X1.66E6156303225P+771baz

Затем, если я выполняю его СНОВА, это возвращается к первому. Это действительно странно.

Если параметрические усилители установлены на "и" или", "я просто возвращаюсь "2" (w/o кавычки) в диалоговом окне.

Также существует ли способ, которым у меня могут быть знаки % быть показанным в аварийном диалоговом окне?

Спасибо

12
задан nevan king 7 April 2010 в 07:57
поделиться

2 ответа

Я думаю, что NSAlert интерпретирует символы % как спецификаторы строкового формата, которые заполняются случайными данными. Просто NSLog вывод, и все в порядке:

%27Decoded%20data%21%27%2Ffoo.bar%3Abaz

Кроме того, у вас есть утечка памяти в методе категории -urlEncoded . Вы создаете строку, используя функцию CF, содержащую Create , поэтому вы несете ответственность за ее освобождение.

-(NSString *) urlEncoded
{
   CFStringRef urlString = CFURLCreateStringByAddingPercentEscapes(
                                                   NULL,
                                                   (CFStringRef)self,
                                                   NULL,
                                                   (CFStringRef)@"!*'\"();:@&=+$,/?%#[]% ",
                                                   kCFStringEncodingUTF8 );
    return [(NSString *)urlString autorelease];
}
23
ответ дан 2 December 2019 в 04:42
поделиться

ОК, оказалось, что это не проблема. Он кодировался правильно, потому что я проверил журналы сервера и, похоже, параметры запроса были закодированы.

И для правильного отображения закодированной строки в диалоговом окне я просто заменил все экземпляры% на %% постфактум.

1
ответ дан 2 December 2019 в 04:42
поделиться