URL中的西里尔符号

aai*_*aev 3 nsurl ios swift

应用程序崩溃并显示以下网址:

let jsonUrl = "http://api.com/??????/events"
let session = NSURLSession.sharedSession()
let shotsUrl = NSURL(string: jsonUrl)
let task = session.dataTaskWithURL(shotsUrl!)
Run Code Online (Sandbox Code Playgroud)

日志:

fatal error: unexpectedly found nil while unwrapping an Optional value
Run Code Online (Sandbox Code Playgroud)

这是因为网址中有西里尔文符号。我该如何解决这个问题。谢谢你的帮助!

Muh*_*raf 11

Swift 4
使用String Extension创建一个名为String + Extension.swift的swift文件并粘贴此代码

import UIKit
extension String{
    var encodeUrl : String
    {
        return self.addingPercentEncoding(withAllowedCharacters: NSCharacterSet.urlQueryAllowed)!
    }
    var decodeUrl : String
    {
        return self.removingPercentEncoding!
    }
}
Run Code Online (Sandbox Code Playgroud)

并像这样使用它:(根据问题进行采样):

"http://api.com/??????/events".encodeUrl
Run Code Online (Sandbox Code Playgroud)


llu*_*sgh 7

尝试这个:

let encodedUrl = jsonUrl.stringByAddingPercentEncodingWithAllowedCharacters(URLQueryAllowedCharacterSet)
Run Code Online (Sandbox Code Playgroud)


Mic*_*ohl 5

像这样的东西:

let apiHost = "http://api.com/"
let apiPath = "??????/events"
let escapedPath = apiPath.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLHostAllowedCharacterSet())
let url = NSURL(string: "\(apiHost)\(escapedPath!)")
Run Code Online (Sandbox Code Playgroud)

显然,您应该做一些更聪明的事情,而不仅仅是 force unwrap escapedPath。

以 Swift 的 Wikipedia 页面为例: https://ru.wikipedia.org/wiki/Swift_(????_????????????????)

变成:

https://ru.wikipedia.org/wiki/Swift_(%D1%8F%D0%B7%D1%8B%D0%BA_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F)
Run Code Online (Sandbox Code Playgroud)

当粘贴到浏览器时,它会将您带到正确的页面(大多数浏览器会方便地为您呈现 UFT-8 字符)。