无法在URL + swift中编码Plus字符

时间:2017-01-10 05:40:39

标签: ios swift url encoding

我正在使用GET方法,我必须在URL中传递电子邮件地址。 API期望它被编码。我试过编码选项,但'+'字符无法编码。

我尝试使用以下代码

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

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

print(escapedString)

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

“@”字符仅编码且“+”未编码。

3 个答案:

答案 0 :(得分:17)

不幸的是,CharacterSet.urlHostAllowedCharacterSet.urlQueryAllowed都包含+ 允许。由于历史原因,大多数Web服务器会将+视为空格的替换(),因此您需要转义+

出于此目的,您可能需要定义自己的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

答案 1 :(得分:3)

使用.urlHostAllowed字符集' +'没有编码。

将扩展名添加到String,如下所示

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

你可以这样做。

答案 2 :(得分:-1)

试试这个:

let encodedEmail = emailAddressTxt.text!

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

let encodedEmail = emailAddressTxt.text!

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

print(escapedString)