Ich habe eine URL-Zeichenfolge ( NSString) mit Leerzeichen und &Zeichen. Wie codiere ich die gesamte Zeichenfolge (einschließlich des &kaufmännischen Und-Zeichens und der Leerzeichen)?
Funktioniert leider stringByAddingPercentEscapesUsingEncodingnicht immer 100%. Es codiert Nicht-URL-Zeichen, lässt jedoch die reservierten Zeichen (wie Schrägstrich /und kaufmännisches Und &) in Ruhe. Anscheinend ist dies ein Fehler , den Apple kennt, aber da er noch nicht behoben wurde, habe ich diese Kategorie verwendet, um eine Zeichenfolge per URL zu codieren:
Warum um alles in der Welt würden Sie eine komplizierte Kategorie wie diese verwenden, anstatt nur zu CFURLCreateStringByAddingPercentEscapes () zu wechseln , wo Sie explizit angeben können, welchen Zeichen Sie immer entkommen möchten.
Lily Ballard
8
@ KevinBallard, weil die CF-Funktion auf einem inklusiven Modell funktioniert ("Escape diese Zeichen") und Sie normalerweise an einem exklusiven Modell arbeiten möchten ("Escape alles außer diesen Zeichen")
@ DaveDeLong Vielleicht habe ich es dort bekommen. Es ist seit ungefähr einem Jahr eine Standardkategorie in all meinen Projekten, also stelle ich mir vor, dass Sie die ursprüngliche Quelle waren! Ich habe den Wortlaut so bearbeitet, dass es nicht so aussieht, als würde ich versuchen, das Schreiben zu würdigen.
Chown
4
Warum? if (thisChar == '') {[Ausgabe appendString: @ "+"]; } Ohne dies, wenn es Leerzeichen mit% 20 codieren wird, wie ich es erwarten würde
Dies codiert auch Parameterbegrenzer wie '&', '?' Nicht korrekt. in dem Fall, in dem Sie Inhalte an eine API übergeben.
Ben Lachman
'&' ist kein gültiges Zeichen für den Parameter der URL-Abfragezeichenfolge. Bitte versuchen Sie, '& amp;' stattdessen.
Nishant
1
stringByAddingPercentEscapesUsingEncoding ist DEPRECATED "Verwenden Sie -stringByAddingPercentEncodingWithAllowedCharacters:stattdessen die empfohlene UTF-8-Codierung und die Codierung für eine bestimmte URL-Komponente oder Unterkomponente, da jede URL-Komponente oder Unterkomponente unterschiedliche Regeln für die Gültigkeit der Zeichen hat."
Mihir Oza
89
Seit Auswahl der Antwort wurden neue APIs hinzugefügt. Sie können jetzt NSURLUtilities verwenden. Verwenden Sie den entsprechenden Zeichensatz, da verschiedene Teile von URLs unterschiedliche Zeichen zulassen. Das folgende Beispiel codiert für die Aufnahme in die Abfragezeichenfolge:
Um '&' spezifisch zu konvertieren, müssen Sie es aus dem URL-Abfragesatz entfernen oder einen anderen Satz verwenden, da '&' in einer URL-Abfrage zulässig ist:
Ich habe eine Weile gebraucht, um herauszufinden, was Sie unter "NSURLUtilities verwenden" verstanden haben - aber jetzt sehe ich, dass dies der Name der Kategorie von NSString ist, in der Apple diese neue Methode in iOS 7 und OS X 10.9 definiert hat.
Jep. Es wurde auch als NSURLUtilities in der Liste der neu veröffentlichten APIs aufgeführt.
Peter DeWeese
'&' ist natürlich in einer Abfragezeichenfolge zulässig, daher werde ich meine Antwort über Richards Link bearbeiten.
Peter DeWeese
3
NSMakeRange('&', 1)funktioniert in Swift nicht, da Swift nicht zulässt, dass char ohne Hacks konvertiert wird. Um diese Lösung in Swift-Code zu verwenden, verwenden Sie removeCharactersInString("&")anstelle von.removeCharactersInRange(...)
cbh2000
16
Swift 2.0 Beispiel (iOS 9 kompatibel)
extension String{
func stringByURLEncoding()->String?{
let characters =NSCharacterSet.URLQueryAllowedCharacterSet().mutableCopy() as!NSMutableCharacterSet
characters.removeCharactersInString("&")
guard let encodedString = self.stringByAddingPercentEncodingWithAllowedCharacters(characters)else{return nil
}return encodedString
}}
Die zulässigen Zeichen hängen tatsächlich von Ihrem Server ab. In meinem Beispiel auf dem Server, auf dem ich nur den zulässigen alphanumerischen Zeichensatz verwendet habe, können Sie diesen in bestimmte Zeichen ändern, um Ihren Anforderungen gerecht zu werden.
Underdog
1
Bei der Frage geht es um die Codierung des Zeichens '&'.
Steve Moser
8
Ich habe mich für die Verwendung des CFURLCreateStringByAddingPercentEscapesAnrufs gemäß der akzeptierten Antwort entschieden. In der neuesten Version von XCode (und IOS) führte dies jedoch zu einem Fehler. Verwenden Sie stattdessen Folgendes:
Es wird kein Speicherplatz codiert. Beispiel @ "string string" und @ "string & string" sind richtig codiert. Bitte teilen Sie mir Ihre Eingabe dazu mit.
Yogesh Lolusare
2
Für mich war die meiste Zeit, die ich damit verbracht habe, dieses Problem zu lösen, die Ablehnungsperiode, in der ich mich geweigert habe zu glauben, dass das Framework nichts enthält, das dem Namen 'Urlencode' ähnelt und dies ohne das Herumspielen tut.
Dancl
6
Versuchen Sie, eine stringByAddingPercentEncodingWithAllowedCharactersMethode zu verwenden [NSCharacterSet URLUserAllowedCharacterSet], die alle Fälle abdeckt
Ziel c
NSString*value =@"Test / Test";
value =[value stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSetURLUserAllowedCharacterSet]];
schnell
var value ="Test / Test"
value.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLUserAllowedCharacterSet())
Nachdem ich alle Antworten zu diesem Thema und die ( falsch ) akzeptierte gelesen habe , möchte ich meinen Beitrag hinzufügen.
WENN das Ziel iOS7 + ist und es 2017 sein sollte, da XCode es wirklich schwierig macht, Kompatibilität unter iOS8 zu liefern, ist der beste Weg, threadsicher, schnell und mit vollständiger UTF-8-Unterstützung, dies zu tun:
(Ziel C-Code)
@implementationNSString(NSString_urlencoding)-(NSString*)urlencode {staticNSMutableCharacterSet*chars = nil;staticdispatch_once_t pred;if(chars)return[self stringByAddingPercentEncodingWithAllowedCharacters:chars];// to be thread safe
dispatch_once(&pred,^{
chars =NSCharacterSet.URLQueryAllowedCharacterSet.mutableCopy;[chars removeCharactersInString:@"!*'();:@&=+$,/?%#[]"];});return[self stringByAddingPercentEncodingWithAllowedCharacters:chars];}@end
Dadurch wird NSString erweitert, verbotene RFC-Zeichen ausgeschlossen, UTF-8-Zeichen unterstützt und Sie können Folgendes verwenden:
Bitte fügen Sie einen Kommentar hinzu, in dem der Grund für Ihre Abstimmungen erläutert wird, damit ich weiß, wie ich in Zukunft eine bessere Antwort schreiben kann 🙂
Ben Leggiero
4
Verwenden Sie NSURLComponents, um HTTP-GET-Parameter zu codieren:
let stringURL ="YOUR URL TO BE ENCODE";
let encodedURLString = stringURL.addingPercentEncoding(withAllowedCharacters:.urlHostAllowed)
print(encodedURLString)
Da stringByAddingPercentEscapesUsingEncodingnicht URL-Zeichen codiert werden, aber die reservierten Zeichen (wie !*'();:@&=+$,/?%#[]) verbleiben, können Sie die URL wie folgt codieren:
let stringURL ="YOUR URL TO BE ENCODE";
let characterSetTobeAllowed =(CharacterSet(charactersIn:"!*'();:@&=+$,/?%#[] ").inverted)if let encodedURLString = stringURL.addingPercentEncoding(withAllowedCharacters: characterSetTobeAllowed){
print(encodedURLString)}
In den Versionshinweisen zu 10.11 lautet der Rat von Apple:
Wenn Sie eine gesamte URL-Zeichenfolge prozentual codieren müssen, können Sie diesen Code verwenden, um einen NSString zu codieren, der als URL gedacht ist (in urlStringToEncode):
scheint nicht zu funktionieren, Zeichen wie & werden immer noch alleine gelassen
kjyv
1
In meinem Fall, in dem die letzte Komponente arabische Buchstaben waren, habe ich Folgendes getan Swift 2.2:
extension String{
func encodeUTF8()->String?{//If I can create an NSURL out of the string nothing is wrong with itif let _ = NSURL(string: self){return self
}//Get the last component from the string this will return subSequence
let optionalLastComponent = self.characters.split { $0 =="/"}.last
if let lastComponent = optionalLastComponent {//Get the string from the sub sequence by mapping the characters to [String] then reduce the array to String
let lastComponentAsString = lastComponent.map{String($0)}.reduce("", combine:+)//Get the range of the last componentif let rangeOfLastComponent = self.rangeOfString(lastComponentAsString){//Get the string without its last component
let stringWithoutLastComponent = self.substringToIndex(rangeOfLastComponent.startIndex)//Encode the last componentif let lastComponentEncoded = lastComponentAsString.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.alphanumericCharacterSet()){//Finally append the original string (without its last component) to the encoded part (encoded last component)
let encodedString = stringWithoutLastComponent + lastComponentEncoded
//Return the string (original string/encoded string)return encodedString
}}}return nil;}}
Verwendung:
let stringURL ="http://xxx.dev.com/endpoint/nonLatinCharacters"if let encodedStringURL = stringURL.encodeUTF8(){if let url = NSURL(string: encodedStringURL){...}}
Aber es ist in iOS 9 veraltet. Was ist der aktualisierte Code dafür?
Sujit Nachan
1
So viele Antworten, die aber bei mir nicht funktionierten, also habe ich Folgendes versucht:
fun simpleServiceCall(for serviceUrl:String, appendToUrl:String){
let urlString:String= serviceUrl + appendToUrl.addingPercentEncoding(withAllowedCharacters:.urlPathAllowed)!
let finalUrl = URL(string: urlString)!//continue to execute your service call... }
Ich hatte ein ähnliches Problem beim Übergeben komplexer Zeichenfolgen als POST-Parameter. Meine Zeichenfolgen können asiatische Zeichen, Leerzeichen, Anführungszeichen und alle Arten von Sonderzeichen enthalten. Die Lösung, die ich schließlich fand, bestand darin, meine Zeichenfolge in die passende Reihe von Unicodes zu konvertieren, z. B. "Hu0040Hu0020Hu03f5 ....", wobei [NSString stringWithFormat: @ "Hu% 04x", [ZeichenfolgenzeichenAtIndex: i]] verwendet wurde, um den Unicode von jedem zu erhalten Zeichen in der ursprünglichen Zeichenfolge. Das gleiche kann in Java gemacht werden.
Diese Zeichenfolge kann sicher als POST-Parameter übergeben werden.
Auf der Serverseite (PHP) ändere ich das gesamte "H" in "\" und übergebe die resultierende Zeichenfolge an json_decode. Der letzte Schritt besteht darin, einfache Anführungszeichen zu umgehen, bevor die Zeichenfolge in MySQL gespeichert wird.
Auf diese Weise kann ich jede UTF8-Zeichenfolge auf meinem Server speichern.
Antworten:
Funktioniert leider
stringByAddingPercentEscapesUsingEncoding
nicht immer 100%. Es codiert Nicht-URL-Zeichen, lässt jedoch die reservierten Zeichen (wie Schrägstrich/
und kaufmännisches Und&
) in Ruhe. Anscheinend ist dies ein Fehler , den Apple kennt, aber da er noch nicht behoben wurde, habe ich diese Kategorie verwendet, um eine Zeichenfolge per URL zu codieren:So verwendet:
Das funktioniert auch:
Einige gute Lektüre zu diesem Thema:
Objective-c iPhone Prozent codieren eine Zeichenfolge?
Objective-C- und Swift-URL-Codierung
http://cybersam.com/programming/proper-url-percent-encoding-in-ios
https://devforums.apple.com/message/15674#15674 http://simonwoodside.com/weblog/2009/4/ 22 / how_to_really_url_encode /
quelle
Dies könnte hilfreich sein
Für iOS 7+ wird empfohlen:
Sie können den zulässigen Zeichensatz gemäß den Anforderungen der URL-Komponente auswählen.
quelle
-stringByAddingPercentEncodingWithAllowedCharacters:
stattdessen die empfohlene UTF-8-Codierung und die Codierung für eine bestimmte URL-Komponente oder Unterkomponente, da jede URL-Komponente oder Unterkomponente unterschiedliche Regeln für die Gültigkeit der Zeichen hat."Seit Auswahl der Antwort wurden neue APIs hinzugefügt. Sie können jetzt NSURLUtilities verwenden. Verwenden Sie den entsprechenden Zeichensatz, da verschiedene Teile von URLs unterschiedliche Zeichen zulassen. Das folgende Beispiel codiert für die Aufnahme in die Abfragezeichenfolge:
Um '&' spezifisch zu konvertieren, müssen Sie es aus dem URL-Abfragesatz entfernen oder einen anderen Satz verwenden, da '&' in einer URL-Abfrage zulässig ist:
quelle
NSMakeRange('&', 1)
funktioniert in Swift nicht, da Swift nicht zulässt, dass char ohne Hacks konvertiert wird. Um diese Lösung in Swift-Code zu verwenden, verwenden SieremoveCharactersInString("&")
anstelle von.removeCharactersInRange(...)
Swift 2.0 Beispiel (iOS 9 kompatibel)
quelle
iOS 7 Update
quelle
Ich habe mich für die Verwendung des
CFURLCreateStringByAddingPercentEscapes
Anrufs gemäß der akzeptierten Antwort entschieden. In der neuesten Version von XCode (und IOS) führte dies jedoch zu einem Fehler. Verwenden Sie stattdessen Folgendes:quelle
Versuchen Sie, eine
stringByAddingPercentEncodingWithAllowedCharacters
Methode zu verwenden[NSCharacterSet URLUserAllowedCharacterSet]
, die alle Fälle abdecktZiel c
schnell
Ausgabe
Test%20%2F%20Test
quelle
Nachdem ich alle Antworten zu diesem Thema und die ( falsch ) akzeptierte gelesen habe , möchte ich meinen Beitrag hinzufügen.
WENN das Ziel iOS7 + ist und es 2017 sein sollte, da XCode es wirklich schwierig macht, Kompatibilität unter iOS8 zu liefern, ist der beste Weg, threadsicher, schnell und mit vollständiger UTF-8-Unterstützung, dies zu tun:
(Ziel C-Code)
Dadurch wird NSString erweitert, verbotene RFC-Zeichen ausgeschlossen, UTF-8-Zeichen unterstützt und Sie können Folgendes verwenden:
Das wird auf Ihrer Debug-Konsole gedruckt:
... beachten Sie auch die Verwendung von dispatch_once, um Mehrfachinitialisierungen in Multithread-Umgebungen zu vermeiden.
quelle
Hier ist ein produktionsbereiter flexibler Ansatz in Swift 5.x :
Anwendungsbeispiel:
Ausgabe:
quelle
Verwenden Sie NSURLComponents, um HTTP-GET-Parameter zu codieren:
http://www.ralfebert.de/snippets/ios/encoding-nsurl-get-parameters/
quelle
Dieser Code hat mir beim Codieren von Sonderzeichen geholfen
quelle
Schneller Code basierend auf der objc-Antwort von chown in diesem Thread.
quelle
Probieren Sie in Swift 3 Folgendes aus:
Da
stringByAddingPercentEscapesUsingEncoding
nicht URL-Zeichen codiert werden, aber die reservierten Zeichen (wie!*'();:@&=+$,/?%#[]
) verbleiben, können Sie die URL wie folgt codieren:quelle
In schnellem 3:
quelle
In den Versionshinweisen zu 10.11 lautet der Rat von Apple:
Wenn Sie eine gesamte URL-Zeichenfolge prozentual codieren müssen, können Sie diesen Code verwenden, um einen NSString zu codieren, der als URL gedacht ist (in urlStringToEncode):
quelle
In meinem Fall, in dem die letzte Komponente arabische Buchstaben waren, habe ich Folgendes getan
Swift 2.2
:Verwendung:
quelle
laut folgendem blog
quelle
So viele Antworten, die aber bei mir nicht funktionierten, also habe ich Folgendes versucht:
Hoffentlich hilft es jemandem. Vielen Dank
quelle
Für einzelne www-formularcodierte Abfrageparameter habe ich eine Kategorie für NSString erstellt:
quelle
// Dies ist ohne Test
quelle
Ich hatte ein ähnliches Problem beim Übergeben komplexer Zeichenfolgen als POST-Parameter. Meine Zeichenfolgen können asiatische Zeichen, Leerzeichen, Anführungszeichen und alle Arten von Sonderzeichen enthalten. Die Lösung, die ich schließlich fand, bestand darin, meine Zeichenfolge in die passende Reihe von Unicodes zu konvertieren, z. B. "Hu0040Hu0020Hu03f5 ....", wobei [NSString stringWithFormat: @ "Hu% 04x", [ZeichenfolgenzeichenAtIndex: i]] verwendet wurde, um den Unicode von jedem zu erhalten Zeichen in der ursprünglichen Zeichenfolge. Das gleiche kann in Java gemacht werden.
Diese Zeichenfolge kann sicher als POST-Parameter übergeben werden.
Auf der Serverseite (PHP) ändere ich das gesamte "H" in "\" und übergebe die resultierende Zeichenfolge an json_decode. Der letzte Schritt besteht darin, einfache Anführungszeichen zu umgehen, bevor die Zeichenfolge in MySQL gespeichert wird.
Auf diese Weise kann ich jede UTF8-Zeichenfolge auf meinem Server speichern.
quelle
Dieser arbeitet für mich.
Ich habe die obige Funktion über diesen Link gefunden: http://useyourloaf.com/blog/how-to-percent-encode-a-url-string/
Sie können diese Funktion auch mit schneller Erweiterung verwenden. Bitte lassen Sie mich wissen, wenn es ein Problem gibt.
quelle