我知道如何以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://
答案 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字符串中问号后面的所有内容进行编码。