Eigentlich alle bisherigen Antworten enthalten zumindest einige Ungenauigkeiten, die für viele gemeinsame Werte anzeigen Text in den Textfeldern versehen wäre nicht richtig mit dem Server kommunizieren
stringByAddingPercentEscapesUsingEncoding:
Prozent entkommt alle Zeichen, die nicht gültig URL sind Figuren. Diese Methode sollte einmal auf die gesamte URL angewendet werden.
Eine frühere Antwort behauptet, dass stringByAddingPercentEscapesUsingEncoding:
funktioniert wie die URL-Erstellung Klassen in vielen Skriptsprachen, wo Sie es nicht auf die gesamte URL-Zeichenfolge anwenden sollten, aber es nicht. Jeder kann dies leicht überprüfen, indem er seine Ausgabe für unescaped &
s und ?
s überprüft. Es ist also in Ordnung, sie auf die gesamte Zeichenfolge anzuwenden, es reicht jedoch nicht aus, sie auf Ihren dynamischen URL-Inhalt anzuwenden.
Die vorherige Antwort ist richtig, dass Sie mehr Arbeit an den Namen und Werten, die in Ihre CGI-Abfrage-Zeichenfolge gehen müssen. Da CGI durch RFC3875 spezifiziert ist, wird dies oft als RFC3875 Prozent Escaping bezeichnet.Es stellt sicher, dass Ihre Namen und Werte keine Zeichen enthalten, die gültige URL Zeichen sind, die aber in anderen Teilen der URL von Bedeutung sind (;
, ?
, :
, @
, &
, =
, $
, +
, {
, }
, <
(>
und ,
)
Es ist jedoch sehr wichtig, auch zu beenden, indem Sie URL-Prozent-Escapes für die vollständige Zeichenfolge ausführen, um sicherzustellen, dass alle Zeichen in der Zeichenfolge gültige URL-Zeichen sind. Während Sie in Ihrem Beispiel nicht sind, könnten im Allgemeinen Zeichen in einem 'statischen' Teil der Zeichenkette sein, die keine gültigen URL-Zeichen sind, also müssen Sie auch diese entschlüsseln.
Leider NSString
gibt uns nicht die Möglichkeit, die RFC3875 signifikanten Zeichen zu entkommen, so müssen wir in CFString
zu tun, um dies zu tun. Offensichtlich CFString
Verwendung eines Schmerz so allgemein füge ich eine Category
auf NSString
wie so:
@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
Mit diesem Category
an Ort und Stelle, konnte das ursprüngliche Problem richtig mit der folgenden gelöst werden:
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];
Dies wird ein wenig variabel schwer ist nur klarer. Beachten Sie auch, dass die zu stringWithFormat:
gelieferte Variablenliste nicht nil
beendet sein sollte. Die Formatzeichenfolge beschreibt die genaue Anzahl der Variablen, die darauf folgen sollen. Auch technisch sollten die Strings für Query-String-Namen (Name, Tags, Entry, ..) selbstverständlich durch stringByAddingPercentEscapesUsingEncoding:
laufen, aber in diesem kleinen Beispiel können wir leicht erkennen, dass sie keine ungültigen URL-Zeichen enthalten.
Um zu sehen, warum die vorherigen Lösungen falsch sind, stellen Sie sich vor, dass der Benutzereingabetext in dreamEntry.text
einen &
enthält, was nicht unwahrscheinlich ist. Bei den vorherigen Lösungen würde der gesamte Text, der diesem Zeichen folgt, zu dem Zeitpunkt verloren gehen, zu dem der Server diesen Text erhalten hat, da das nicht-skalierte Et-Zeichen vom Server als Ende des Wertteils dieses Abfrage-String-Paares interpretiert wird.
hehe Punkt genommen. Vielen Dank! – bcsantos