:
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