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