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" (без кавычек) в диалоговом окне.
Также есть способ, которым я могу показать знаки% в диалоговом окне оповещений?
Спасибо
Ответы
Ответ 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;
}