在我的应用中,我需要将一个base64编码的字符串作为查询参数发送到服务器,例如。
&data=AwGZnyx+JUi0PFJoyYSEDpgtlrxP(cut...)==
问题是,当我的字符串中没有加号时,任何工作都可以正常工作:另一方面,每次有一个加号时,服务器代码的行为都不正确。
我注意到有逃避函数(例如。addingPercentEncoding
),但它们不适用于加号。
除了“手动”删除所有优点(例如使用正则表达式)之外,还有什么我可以做的吗?
如果我使用的话,目前一切正常:
string.replacingOccurrences(of: "+", with: "%2B")
答案 0 :(得分:1)
服务器可能将+
符号解释为空格,因为它通常在查询参数中用作空格的替代。 addPercentEncoding
不会对您有所帮助,因为它只会翻译非ASCII字符。
您需要手动将+
替换为%2B
。
....虽然
NSString
的{{3}}版本也需要CharacterSet
作为参数。所以你可以使用addPercentEncoding创建一个除了+
之外的所有base64字符的Characterset,即
let safeChars = Characterset(charactersIn: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrtuvwxyz0123456789/=")
答案 1 :(得分:1)
构建网址的一个好方法是使用URLComponents
。这应该适用于几乎所有情况,下面显示了一个示例:
let base64 = "AwGZnyx+JUi0PFJoyYSEDpgtlrxP(cut...)=="
var components = URLComponents(string: "https://example.com")
components?.queryItems = [ URLQueryItem(name: "data", value: "AwGZnyx+JUi0PFJoyYSEDpgtlrxP(cut...)==") ]
let url = components?.url
<强>结果:强>
https://example.com?data=AwGZnyx+JUi0PFJoyYSEDpgtlrxP(cut...)%3D%3D
但是,在您的特定情况下,似乎服务器未正确处理+
,您需要解决与上述问题类似的问题。更好的解决方法是将服务器更改为正确处理URL。
let base64 = "AwGZnyx+JUi0PFJoyYSEDpgtlrxP(cut...)=="
var components = URLComponents(string: "https://example.com")
components?.queryItems = [ URLQueryItem(name: "data", value: base64) ]
let urlString = components?.string.replacingOccurrences(of: "+", with: "%2B")
<强>结果:强>
https://example.com?data=AwGZnyx%252BJUi0PFJoyYSEDpgtlrxP(cut...)%3D%3D