Cyrillic symbols in URL

廉价感情. 提交于 2019-12-07 18:12:35

问题


App crashes with following url:

let jsonUrl = "http://api.com/алматы/events"
let session = NSURLSession.sharedSession()
let shotsUrl = NSURL(string: jsonUrl)
let task = session.dataTaskWithURL(shotsUrl!)

Log:

fatal error: unexpectedly found nil while unwrapping an Optional value

It's because of cyrillic symbols in url. How can I solve this issue. Thanks for your help!


回答1:


Try this:

let encodedUrl = jsonUrl.stringByAddingPercentEncodingWithAllowedCharacters(URLQueryAllowedCharacterSet)



回答2:


Swift 4
Using String Extension Create a swift file named String+Extension.swift and paste this code

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

and Use it like so: (sample according to question):

"http://api.com/алматы/events".encodeUrl



回答3:


Something like this:

let apiHost = "http://api.com/"
let apiPath = "алматы/events"
let escapedPath = apiPath.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLHostAllowedCharacterSet())
let url = NSURL(string: "\(apiHost)\(escapedPath!)")

Obviously you should do something smarter than just force unwrap escapedPath.

Using the Wikipedia page for Swift as an example:

https://ru.wikipedia.org/wiki/Swift_(язык_программирования) becomes 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) which when pasted into the browser takes you to the right page (and most browsers will conveniently render the UFT-8 characters for you).




回答4:


Non-ASCII characters (and many special characters) need to be escaped in a URL. Chrome and other browser do it automatically. And they unescape the URLs in the address bar for a nicer display.

So if you have a static URL, just paste it into the adressbar, press enter, selected the URL again, copy and paste it to your app:

So instead of:

let jsonUrl = "http://api.com/алматы/events"

You'll get:

let jsonUrl = "http://api.com/%D0%B0%D0%BB%D0%BC%D0%B0%D1%82%D1%8B/events"



回答5:


Try stringByAddingPercentEncodingWithAllowedCharacters: defined on NSString. You may see people suggesting stringByAddingPercentEscapesUsingEncoding:, but that method is deprecated in iOS 9.

There are also a few predefined NSCharacterSets in Foundation, such as URLHostAllowedCharacterSet and URLPathAllowedCharacterSet. Therefore, if you really have to parse the unescaped URL in code (using preprocessed URLs, mentioned in the accepted answer, is usually a much better idea), you can write a helper method like this:

import Foundation

func url(scheme scheme: String, host: String, path: String) -> NSURL? {
    let components = NSURLComponents()
    components.scheme = scheme
    components.host = host.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLHostAllowedCharacterSet())
    components.path = path.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLPathAllowedCharacterSet())
    return components.URL
}

// evaluates to http://api.com/%25D0%25B0%25D0%25BB%25D0%25BC%25D0%25B0%25D1%2582%25D1%258B/events
url(scheme: "http", host: "api.com", path: "/алматы/events")

Note that the above documentation mentions that

This method is intended to percent-encode an URL component or subcomponent string, NOT an entire URL string.

That's because according RFC 3986, not all parts of an URL can be percent-encoded (e.g. scheme - http/https/etc.)




回答6:


in xamarin:

var uri = new Uri (url);
var nsurl = new NSUrl (uri.GetComponents (UriComponents.HttpRequestUrl, UriFormat.UriEscaped));
UIApplication.SharedApplication.OpenUrl (nsurl);



回答7:


URLs cannot contain Cyrillic characters. There are standards how to translate Cyrillic characters into valid URLs - you might find something if you search for "Punicode" (the P is intentional).



来源:https://stackoverflow.com/questions/35148507/cyrillic-symbols-in-url

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!