如何知道字符串是否已经使用特殊字符特殊转义?

时间:2017-11-16 06:27:52

标签: ios swift string encoding decoding

我有这个网址:

"http://www.somedomain.com/folder/مرحبا المستخدم.jpg"

所以我需要逃避这些阿拉伯语值,否则它将无法创建URL对象。

我这样做,

let originalString = "http://www.somedomain.com/folder/مرحبا المستخدم.jpg"
let escapedString = originalString.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)

这将是escapedString

的输出

http://www.somedomain.com/folder/%D9%85%D8%B1%D8%AD%D8%A8%D8%A7%20%D8%A7%D9%84%D9%85%D8%B3%D8%AA%D8%AE%D8%AF%D9%85.jpg

到目前为止一切顺利。但是,当我强制尝试逃避已经转义的URL时,结果很奇怪。

如何检查字符串是否已编码?

3 个答案:

答案 0 :(得分:4)

你可以顺利地做到:

extension String {
    func isEscaped() -> Bool {
        return self.removingPercentEncoding != self
    }
}

然后

let yourEscapedString = "http://www.somedomain.com/folder/%D9%85%D8%B1%D8%AD%D8%A8%D8%A7%20%D8%A7%D9%84%D9%85%D8%B3%D8%AA%D8%AE%D8%AF%D9%85.jpg"
print(yourEscapedString.isEscaped()) // true

let yourNotEscapedString = "http://www.somedomain.com/folder/مرحبا المستخدم.jpg"
print(yourNotEscapedString.isEscaped()) // false

答案 1 :(得分:0)

我不知道但可能会工作。

您可以检查您的网址是否有效,如果有效则无需转发agin,如果没有,那么您应该逃避它。

类似检查网址是否有效

func isValidMyURL (_ urlString: NSString) -> Bool {
    let urlRegEx = "((?:http|https)://)?(?:www\\.)?[\\w\\d\\-_]+\\.\\w{2,3}(\\.\\w{2})?(/(?<=/)(?:[\\w\\d\\-./_]+)?)?"
    return NSPredicate(format: "SELF MATCHES %@", urlRegEx).evaluateWithObject(urlString)
}

然后

if !isValidMyURL(originalString) { // If not valid then escape it
    let escapedString = originalString.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)
}

其他方面直接使用escapedString

答案 2 :(得分:0)

我无法对此进行测试,但我会先尝试'unescape'原始字符串,然后将结果与原始字符串进行比较。如果它们匹配,则原始字符串中没有转义。如果它们不匹配,则原始字符串已经转义。