Вопрос

Я пытаюсь отправить содержимое UITextView или UITextField в качестве параметров в файл php.

NSString *urlstr = [[NSString alloc] initWithFormat:@"http://server.com/file.php?name=%@&tags=%@&entry=%@",nameField.text, tagsField.text, dreamEntry.text];

Когда я регистрирую urlstr, формат URL-адреса в порядке, если UITextView или UITextField не содержат пробелов.Как мне преобразовать пробелы в %20 ?

редактировать

вот код в настоящее время, который не только дает сбой, но и неправильно кодирует URL-адрес.

name=Джон Доу&tags=повторяющийся кошмар&entry=Тестирование, тестирование, тестирование

преобразуется в

name=John -1844684964oe&tags=recurringightmare&entry=Testing 4.214929e-307sting -1.992836e+00sting

- (IBAction)sendButtonPressed:(id)sender
{

    NSString *urlString = [[NSString alloc] initWithFormat:@"http://server.com/file.php?name=%@&tags=%@&entry=%@", nameField.text, tagsField.text, dreamEntry.text];

    NSString *encodedString = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

    NSURL *url = [[NSURL alloc] initWithString:encodedString];

    NSLog(encodedString);

    NSLog(urlString);

    [urlString release];
    [url release];
    [encodedString release];


}
Это было полезно?

Решение

Вы не должны экранировать URL-адрес всей строки, вы должны экранировать URL-адрес динамических компонентов.Пытаться

NSString *urlStr = [NSString stringWithFormat:@"http://server.com/file.php?name=%@&tags=%@&entry=%@",
                        [nameField.text stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding],
                        [tagsField.text stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding],
                        [dreamEntry.text stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding],
                        nil];
NSURL *url = [NSURL URLWithString:urlStr];

Вторая проблема с вашим кодом (и, несомненно, причина странной печати) заключается в том, что вы передаете строку непосредственно в NSLog, поэтому она рассматривается как строка формата.Вам нужно использовать

NSLog(@"%@", encodedString);

вместо.Это заставит его печатать, как ожидалось.

Редактировать:Третья проблема с вашим кодом заключается в том, что вы смешиваете автоматически выпускаемые и собственные объекты, а затем освобождаете их все в конце.Посмотрите на три объекта, которые вы создали и которые впоследствии выпустите позже.Один из них не должен быть выпущен позже, поскольку он был создан методом, который не начинается со слов alloc, copy или new.Идентификация рассматриваемого объекта — это задание, оставленное читателю.

Другие советы

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

stringByAddingPercentEscapesUsingEncoding: процент экранирует все символы, которые не являются допустимыми символами URL.Этот метод следует применить один раз ко всему URL-адресу.

В предыдущем ответе утверждается, что stringByAddingPercentEscapesUsingEncoding: работает как классы построения URL-адресов во многих языках сценариев, где не следует применять его ко всей строке URL-адреса, но это не так.Любой может легко убедиться в этом, проверив его вывод на наличие неэкранированных символов. &песок ?с.Таким образом, можно применить ко всей строке, но недостаточно применить к содержимому вашего «динамического» URL-адреса.

Предыдущий ответ верен в том смысле, что вам придется еще немного поработать с именами и значениями, которые входят в строку запроса CGI.Поскольку CGI указан в RFC3875, это часто называют процентным экранированием RFC3875.Он гарантирует, что ваши имена и значения не содержат символов, которые являются допустимыми символами URL-адреса, но которые имеют значение в других частях URL-адреса (;, ?, :, @, &, =, $, +, {, }, <, >, и ,)

Однако очень важно также закончить, выполнив простое процентное экранирование URL-адреса для всей строки, чтобы убедиться, что все символы в строке являются допустимыми символами URL-адреса.Хотя в вашем примере это не так, в целом в «статической» части строки могут быть символы, которые не являются допустимыми символами URL-адреса, поэтому вам также необходимо их экранировать.

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

@interface NSString (RFC3875)
- (NSString *)stringByAddingRFC3875PercentEscapesUsingEncoding:(NSStringEncoding)encoding;
@end

@implementation NSString (RFC3875)
- (NSString *)stringByAddingRFC3875PercentEscapesUsingEncoding:(NSStringEncoding)encoding {
    CFStringEncoding cfEncoding = CFStringConvertNSStringEncodingToEncoding(encoding);
    NSString *rfcEscaped = (NSString *)CFURLCreateStringByAddingPercentEscapes(
                                                NULL, 
                                                (CFStringRef)self,
                                                NULL, 
                                                (CFStringRef)@";/?:@&=$+{}<>,",
                                                cfEncoding);
    return [rfcEscaped autorelease];
}
@end

С этим Category на месте исходная проблема может быть правильно решена с помощью следующего:

NSString *urlEscapedBase = [@"http://server.com/file.php" stringByAddingPercentEscapesUsingEncoding:
                                            NSUTF8StringEncoding];
NSString *rfcEscapedName = [nameField.text stringByAddingRFC3875PercentEscapesUsingEncoding:
                                                NSUTF8StringEncoding];
NSString *rfcEscapedTags = [tagsField.text stringByAddingRFC3875PercentEscapesUsingEncoding:
                                                NSUTF8StringEncoding];
NSString *rfcEscapedEntry = [dreamEntry.text stringByAddingRFC3875PercentEscapesUsingEncoding:
                                                NSUTF8StringEncoding];

NSString *urlStr = [NSString stringWithFormat:@"%@?name=%@&tags=%@&entry=%@",
                                urlEscapedBase,
                                rfcEscapedName,
                                rfcEscapedTags,
                                rfcEscapedEntry];

NSURL *url = [NSURL URLWithString:urlStr];

Это немного тяжелая переменная, просто будьте более ясны.Также обратите внимание, что список переменных, предоставленный stringWithFormat: не должно быть nil прекращено.Строка формата описывает точное количество переменных, которые должны следовать за ней.Кроме того, технически строки для имен строк запроса (имя, теги, запись и т. д.) должны проходить через stringByAddingPercentEscapesUsingEncoding: это само собой разумеющееся, но в этом небольшом примере мы легко видим, что они не содержат недопустимых символов URL.

Чтобы понять, почему предыдущие решения неверны, представьте, что пользователь вводит текст в dreamEntry.text содержит &, что не маловероятно.При использовании предыдущих решений весь текст, следующий за этим символом, будет потерян к тому времени, когда сервер получит этот текст, поскольку неэкранированный амперсанд будет интерпретироваться сервером как завершающая часть значения этой пары строк запроса.

Вы можете взять свой URL-адрес и использовать:

NSString *urlStr = [[NSString alloc] initWithFormat:@"http://server.com/file.php?name=%@&tags=%@&entry=%@",nameField.text, tagsField.text, dreamEntry.text];

NSString *encStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top