Couldn't encode Plus character in URL + swift

2019-02-18 18:21发布

i am using a GET method in which i have to pass a email address in the URL. API expects it to be encoded. I tried with the encoding options but the '+' character couldnt be encoded.

i tried with the following code

let encodedEmail = emailAddressTxt.text!.addingPercentEncoding(withAllowedCharacters:.urlHostAllowed)

let urlString = "http://www.example.com/User/GetUserDetailsByEmailAddress?EmailAddress=\(encodedEmail!)"

print(escapedString)

It prints http://www.example.com/User/GetUserDetailsByEmailAddress?EmailAddress=mano+1%40gmail.com

Where the '@' character is only encoded and '+' is not encoded.

3条回答
\"骚年 ilove
2楼-- · 2019-02-18 18:55

Unfortunately, both CharacterSet.urlHostAllowed and CharacterSet.urlQueryAllowed contains + as allowed. And for historical reason, most web servers treat + as a replacement of whitespace (), so you need to escape +.

For such purpose, you may need to define your own CharacterSet:

extension CharacterSet {
    static let rfc3986Unreserved = CharacterSet(charactersIn: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~")
}

let emailAddressText = "mano+1@gmail.com"

let encodedEmail = emailAddressText.addingPercentEncoding(withAllowedCharacters:.rfc3986Unreserved)

print(encodedEmail!) //->mano%2B1%40gmail.com
查看更多
来,给爷笑一个
3楼-- · 2019-02-18 18:56

When you use .urlHostAllowed character set '+' is not encoded.

Add extension to String like below

public func stringByAddingPercentEncodingToData() -> String? {
    let finalString = self.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlHostAllowed)?.replacingOccurrences(of: "&", with: "%26").replacingOccurrences(of: "+", with: "%2B")
    return finalString
}

You can do something like this.

查看更多
疯言疯语
4楼-- · 2019-02-18 18:57

Try this :

let encodedEmail = emailAddressTxt.text!

        var urlString = "http://yyy.xxx.com/User/GetUserDetailsByEmailAddress?EmailAddress=\(encodedEmail)"
        urlString = urlString.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)

or

let encodedEmail = emailAddressTxt.text!

let urlString = "http://yyy.xxx.com/User/GetUserDetailsByEmailAddress?EmailAddress=\(encodedEmail!)"
urlString = urlString.addingPercentEncoding(withAllowedCharacters:.urlHostAllowed)

print(escapedString)
查看更多
登录 后发表回答