使用http://对URL进行编码

时间:2016-05-22 15:29:41

标签: swift swift2

我知道如何以URL格式编码字符串(笑脸是故意的):

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

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

但如果我将http://附加到未转义的字符串,Swift也会逃脱冒号:

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

如果没有手动删除和添加http://,我怎样才能正确地删除这些字符串?我必须处理其他前缀,例如https://ftp://ssh://

3 个答案:

答案 0 :(得分:5)

:不是网址路径部分的合法字符。您对所有内容进行了百分比编码,而不是URLPathAllowedCharacterSet,因此:编码时不应该感到惊讶。

网址的每个部分都有不同的编码规则。 iOS无法正确编码URL,直到它知道哪些部分发生了什么,并且它无法通过未编码的字符串执行此操作(因为它必须首先解析它,并且它可以' ; t解析它,因为它还没有正确编码)。在某些系统(包括旧版本的iOS)中,它会使用假设的各种启发式方法,好吧,我猜你可能意味着..."而不是实际遵循URL编码规则。这是方便的常见情况,而错误编码不太常见但合法的情况(特别是涉及非http URL和非拉丁语URL)。 iOS现在遵循规则,所以事情编码一致,但这意味着你需要实际考虑URL而不是只是在系统中抛出随机的东西,并希望它能够解决它。

执行此操作的最佳方法(如果您必须动态计算此内容)与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.

如果您有一些不必担心动态编码的基本静态网址,请参阅NSURLComponents.URLReativeToURL

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

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

答案 1 :(得分:0)

你会感到困惑 - 根据HTTP标准,域名之后的特殊字符需要使用“百分比编码”进行转义(我不认为100%是正确的术语)。

域名本身可以包含任何unicode代码点(然后客户端应该应用Punycode将其映射到DNS名称),并且URL分类器(u必须不是逃脱了。

所以,是的,你需要以不同的方式处理你网址的这些部分 - 没办法解决这个问题。其他协议可能需要特殊字符的其他编码,而不是HTTP。例如,r URL类(非常特定于应用程序.SSH因为它只是一系列安全传输,而不是描述l niform ssh:资源{{1根据你对{{1}}“URL”的实际含义,可能会有非常不同的非ASCII字符方法,而不是HTTP。

答案 2 :(得分:0)

最快的方法:

在过去,您使用转义并将您的字符串编码为UTF8编码以下语句:

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

现在不推荐使用此代码,因此swift 2.2中的等效代码为:

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

它对URL字符串中问号后面的所有内容进行编码。