2016-05-22 13 views
3

Ich weiß, wie man einen String im URL-Format zu kodieren (das Smiley-Gesicht ist beabsichtigt):Encode URL mit http: //

let str = "www.mywebsite.com/.html" 
let escapedStr = str.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLPathAllowedCharacterSet())! 
print(escapedStr) 

// Output: 
// www.mywebsite.com/%F0%9F%98%80.html 

Aber wenn ich http:// an den unescaped Zeichenfolge anhängen entkommt Swift den Doppelpunkt zu:

let str = "http://www.mywebsite.com/.html" 
let escapedStr = str.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLPathAllowedCharacterSet())! 
print(escapedStr) 

// Output 
// http%3A//www.mywebsite.com/%F0%9F%98%80.html 

So kurz Entfernen und Hinzufügen von http:// manuell, wie kann ich die Saiten richtig entkommen? Es gibt auch andere Präfixe ich umgehen muss handhaben wie https://, ftp:// oder ssh://

Antwort

5

: ist kein gültiges Zeichen im Pfadteil einer URL. Du prozent-codierst alles nicht in URLPathAllowedCharacterSet, daher sollte es nicht überraschen, dass die : codiert wurde.

Jeder Teil einer URL hat unterschiedliche Kodierungsregeln. iOS kann eine URL nicht korrekt codieren, solange sie nicht weiß, was in welchen Teil gehört, und nicht von einer nicht codierten Zeichenkette (da sie zuerst analysiert werden muss und sie nicht parsen kann, weil sie nicht korrekt ist) codiert noch). In einigen Systemen (einschließlich älterer Versionen von iOS) würde es verschiedene Heuristiken verwenden, die "naja, ich nehme an, du meintest wahrscheinlich ..." angenommen habe, anstatt die URL-Codierungsregeln tatsächlich zu befolgen. Dies war ein praktischer Fall, bei dem weniger häufige, aber legale Fälle falsch codiert wurden (insbesondere bei Nicht-HTTP-URLs und nicht-lateinischen URLs). iOS folgt nun den Regeln, also kodieren Dinge konsistent, aber es bedeutet, dass Sie wirklich über URLs nachdenken müssen und nicht einfach nur zufällige Sachen in das System werfen und hoffen, dass es das herausfindet.

Der beste Weg, dies zu tun (wenn Sie das Zeug dynamisch zu berechnen haben) ist mit NSURLComponents:

let url = NSURLComponents() 
url.scheme = "http" 
url.host = "www.mywebsite.com" 
url.path = "/.html" 

url.string    // "http://www.mywebsite.com/%F0%9F%98%80.html" 
url.percentEncodedPath // "/%F0%9F%98%80.html" 
url.URL     // http://www.mywebsite.com/%F0%9F%98%80.html 
// etc. 

auch NSURLComponents.URLReativeToURL Sehen Sie, wenn Sie einige Basis haben, statische URL, die Sie keine Angst haben über die dynamische Codierung.

Sie

In den vergangenen verwenden, um die Zeichenfolge zu entkommen und codieren Codierung folgende Erklärung UTF8:

let baseURL = NSURL(string: "http://www.mywebsite.com") 

let relative = NSURLComponents() 
relative.path = "/.html" 
let url = relative.URLRelativeToURL(baseURL) 
url?.absoluteString 
0

Sie verwirrende Dinge sind - die Sonderzeichen nach dem Domainnamen müssen die „Prozent-Codierung“ zu entkommen mit (ich glaube nicht, dass 100% ist der richtige Begriff), nach dem HTTP-Standard.

Der Domain-Name kann sich jeden Unicode-Codepoint enthalten (und der Kunde sollte dann Punycode es auf einen DNS-Namen zuzuordnen) und der URL-Klassifikator (http:) muss nicht entgangen sein.

Also, ja, Sie müssen diese Teile Ihrer URL anders behandeln - in keiner Weise. Andere Protokolle erfordern möglicherweise eine andere Codierung von Sonderzeichen als HTTP. Zum Beispiel die ssh: URL-Klasse (die ziemlich anwendungsspezifisch ist. SSH, wie es nur eine Familie von sicheren Transporten ist, kein Mittel, um eine u niform r ocation zu beschreiben) wird wahrscheinlich sehr unterschiedliche Ansätze zu Nicht-ASCII-Zeichen als HTTP, abhängig davon, was Sie eigentlich mit ssh: "URLs" meinen.

0

Der schnellste Weg zu tun

let str = "http://www.mywebsite.com/.html" 
let escapedStr = str.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding) 

Nun wird dieser Code so das Äquivalent veraltet in schnell 2.2 ist:

let str = "http://www.mywebsite.com/.html" 
let escapedStr = str.stringByAddingPercentEncodingWithAllowedCharacters(.URLQueryAllowedCharacterSet()) 

Es codiert alles nach dem Fragezeichen in der URL-Zeichenfolge.