用有效的URL字符替换String中的所有特殊字符

4 swift

我无法弄清楚如何替换字符串中的所有特殊字符并将其转换为我可以在URL中使用的字符串.

我正在使用它:我上传一个图像,将其转换为base64,然后将其传递给Laravel框架,但是base64 string可以包含+, /, \等等,这会改变URL的含义.

我可以用+以下代码替换标志:

let withoutPlus = image.stringByReplacingCharactersInRange("+", withString: "%2B")
Run Code Online (Sandbox Code Playgroud)

然而,我不能用它作为NSString尝试和改变其他角色.

当然有一种方法可以只针对每一个特殊字符并将其转换为URL中可用的东西吗?

Mik*_*e S 5

您可以stringByAddingPercentEncodingWithAllowedCharacters根据需要使用转义字符.你传递一个NSCharacterSet包含有适用于该字符串(即那些你的人物希望替换).NSCharacterSetURL查询字符串中允许使用内置字符,这些字符可以帮助您完成大部分工作,但它包含+,/因此您需要从集合中删除它们.您可以通过制作该集的可变副本然后调用来实现removeCharactersInString:

let allowedCharacters = NSCharacterSet.URLQueryAllowedCharacterSet().mutableCopy() as NSMutableCharacterSet
allowedCharacters.removeCharactersInString("+/=")
Run Code Online (Sandbox Code Playgroud)

然后你可以调用stringByAddingPercentEncodingWithAllowedCharacters你的字符串,传入allowedCharacters:

let encodedImage = image.stringByAddingPercentEncodingWithAllowedCharacters(allowedCharacters)
Run Code Online (Sandbox Code Playgroud)

请注意,它将返回一个optional String(String?),因此您可能希望使用可选绑定:

if let encodedImage = image.stringByAddingPercentEncodingWithAllowedCharacters(allowedCharacters) {
    /* use encodedImage here */
} else {
    /* stringByAddingPercentEncodingWithAllowedCharacters failed for some reason */
}
Run Code Online (Sandbox Code Playgroud)

例:

let unencodedString = "abcdef/+\\/ghi"

let allowedCharacters = NSCharacterSet.URLQueryAllowedCharacterSet().mutableCopy() as NSMutableCharacterSet
allowedCharacters.removeCharactersInString("+/=")

if let encodedString = unencodedString.stringByAddingPercentEncodingWithAllowedCharacters(allowedCharacters) {
    println(encodedString)
}
Run Code Online (Sandbox Code Playgroud)

打印:

ABCDEF%2F%2B%5C%2Fghi