Подтвердить что ты не робот

URLEncoding строка с Objective-C

Я пытаюсь URL кодировать строку, чтобы сформировать запрос GET из objective-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

Тогда, если я запустил его с AGAIN, он вернется к первому. Это действительно странно.

Если параметрам присвоено значение @ "&" или @ "Я просто верну" 2" (без кавычек) в диалоговом окне.

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

Спасибо

4b9b3361

Ответ 1

Я думаю, что 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];
}

Ответ 2

Я открыл свой класс утилиты URL-кодировщика, который интеллектуально пропускает часть домена и пути URL-адреса (чтобы избежать кодирования косых черт и т.д.) и избегать только процентных последовательностей, за которыми не следует 2-значный шестнадцатеричные коды (для предотвращения двойного кодирования таких процентов: %20 → % 2520).

Он был протестирован против более чем 10 000 URL-адресов и является очень надежным и эффективным.

Вы можете узнать больше о (и скачать) моей реализации здесь... http://jayfuerstenberg.com/devblog/url-encoding-in-objective-c

Ответ 3

Вместо автоматического оповещения, который больше не доступен при использовании ARC, создайте свой метод экземпляра, передав строку и используя CFBridgingRelease:

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

Ответ 4

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

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

Ответ 5

По-моему, самый простой способ - использовать удобный метод, поставляемый с NSString (NSURLUtilities) category

Моя реализация:

- (NSString *) urlEncodedString
{
    NSString *result = [self stringByReplacingOccurrencesOfString:@" " withString:@"+"];
    result = [result stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    return result;
}