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

Swift 用有效的URL字符替换字符串中的所有特殊字符,swift,Swift,我不知道如何替换字符串中的所有特殊字符,并将其转换为可以在URL中使用的字符串 我使用它的目的是: 我正在上载一个图像,将其转换为base64,然后将其传递给Laravel框架,但是base64字符串可以包含+,/,\等,这会改变URL的含义 我可以用以下代码替换+符号: let withoutPlus = image.stringByReplacingCharactersInRange("+", withString: "%2B") 但是,我不能将其用作NSString来尝试更改其他字符 当

我不知道如何替换字符串中的所有特殊字符,并将其转换为可以在URL中使用的字符串

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

我可以用以下代码替换
+
符号:

let withoutPlus = image.stringByReplacingCharactersInRange("+", withString: "%2B")
但是,我不能将其用作
NSString
来尝试更改其他字符

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

您可以根据需要使用转义字符。向其传递一个
NSCharacterSet
,其中包含对该字符串有效的字符(即不希望替换的字符)。对于URL查询字符串中允许的字符,有一个内置的
NSCharacterSet
,它可以让您大致了解这些字符,但它包括
+
/
,因此您需要从集合中删除这些字符。您可以通过创建集合的可变副本,然后调用
removeCharactersInString

let allowedCharacters = NSCharacterSet.URLQueryAllowedCharacterSet().mutableCopy() as NSMutableCharacterSet
allowedCharacters.removeCharactersInString("+/=")
然后,您可以通过在字符串上添加PercentEncodingwithAllowedCharacters
来调用
Strings,并传入
allowedCharacters

let encodedImage = image.stringByAddingPercentEncodingWithAllowedCharacters(allowedCharacters)
请注意,它将返回可选的
字符串(
字符串?
),因此您可能希望使用可选绑定:

if let encodedImage = image.stringByAddingPercentEncodingWithAllowedCharacters(allowedCharacters) {
    /* use encodedImage here */
} else {
    /* stringByAddingPercentEncodingWithAllowedCharacters failed for some reason */
}
示例:

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

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

if let encodedString = unencodedString.stringByAddingPercentEncodingWithAllowedCharacters(allowedCharacters) {
    println(encodedString)
}
印刷品:

abcdef%2F%2B%5C%2Fghi

使用

而不是
image.stringByReplacingCharactersInRange
。请注意,您的POST调用不起作用,因为该方法声明为

func stringByReplacingCharactersInRange(range: Range<String.Index>, withString replacement: String) -> String 
func stringByReplacingCharactersInRange(范围:range,带字符串替换:String)->String

您没有提供正确的参数。

您最好使用POST发送文件,而不是将其编码到URL中

但我无法删除任何字符,它是
base64图像
,因此它包括
+
/
,那个么,我怎样才能用ascii字符替换它们呢?这不是删除字符,而是用%编码版本替换它们。我的答案中删除字符的部分是从字符串中允许的字符集中删除字符,而不是从字符串本身中删除字符。@user3723418 Mike对这些字符进行百分比编码的原因是web服务器不会试图将其解释为URL的一部分,当它在URL或
应用程序/x-www-form-urlencoded
请求中收到此信息时,将自动对其进行百分比解码,恢复您的
+
/
字符。另外,您提到在URL中使用此信息。URL的长度是有限的,通常可以避免在URL中放置非常长的图像base64字符串表示形式。如果您想上传base64字符串,您可能需要创建一个
POST
请求,其
内容类型为
application/x-www-form-urlencoded
。Mike的百分比转义答案仍然适用于该场景,但您通常不会将其放在URL中,否则它可能会被截断。
func stringByReplacingCharactersInRange(range: Range<String.Index>, withString replacement: String) -> String