Xcode 9中是否添加``添加percenceCoding'''



在使用 addingPercentEncoding的Xcode 9 beta 2中的Swift 3.x中,给出了意外的结果。CharacterSet.urlPathAllowed总是包含":",因此根据addingPercentEncoding的定义,它永远不应逃脱它。但是,使用此代码:

// always true
print(CharacterSet.urlPathAllowed.contains(":"))
let myString = "info:hello world"
let escapedString = myString.addingPercentEncoding(withAllowedCharacters: .urlPathAllowed)!
print(escapedString)

我得到这些结果:

我得到不良行为的情况

  • Xcode 9 Beta 2,iOS 9.3
  • Xcode 9 beta 2,iOS 11.0

    true
    信息%3Ahello%20world

我得到预期行为的情况

  • Xcode 9 beta 2,ios 10.3.1
  • xcode 8.3.3,任何ios

    true
    信息:您好%20world

是否有任何解决方法可以正确地实现addingPercentEncoding,可以正确尊重给定的allowedCharacters

显然,当用作参考的字符集是基础nscharacterset类时, addingPercentEncoding做了一些无证件的魔法。

为了使这种魔术加入,您需要使角色集成为纯粹的迅速对象。为此,我将创建一个副本(感谢Martin R!(,以便邪恶的魔法消失了:

let myString = "info:hello world"
let csCopy = CharacterSet(bitmapRepresentation: CharacterSet.urlPathAllowed.bitmapRepresentation)
let escapedString = myString.addingPercentEncoding(withAllowedCharacters: csCopy)!
//always "info:hello%20world"
print(escapedString)

作为扩展名:

extension String {
    func safeAddingPercentEncoding(withAllowedCharacters allowedCharacters: CharacterSet) -> String? {
        // using a copy to workaround magic: https://stackoverflow.com/q/44754996/1033581
        let allowedCharacters = CharacterSet(bitmapRepresentation: allowedCharacters.bitmapRepresentation)
        return addingPercentEncoding(withAllowedCharacters: allowedCharacters)
    }
}

现在逃脱了:字符的百分比是.urlPathAllowed现在严格观察RFC 3986,该第3.3节中的"路径":

另外,URI参考(第4.1节(可以是相对路径参考,在这种情况下,第一路径段不能包含结肠(":"(字符。

因此,:在相对路径中允许(这是我们在这里处理的(,但根本不在第一个组件中。

考虑:

let string = "foo:bar/baz:qux"
print(string.addingPercentEncoding(withAllowedCharacters: .urlPathAllowed)!)

将以RFC 3986的一致性来编码第一个组件中的:,但允许其在后续组件中未经编码:

 foo%3abar/baz:qux 

此字符集不是仅根据集合中的字符来编码的百分比,而是实际上应用了RFC 3986的相对路径逻辑。但是正如C– ur所说,如果需要的话,可以通过与.urlPathAllowed相同的字符构建自己的角色集来绕过此逻辑,并且该新字符集将不应用此RFC 3986逻辑。

相关内容

  • 没有找到相关文章

最新更新