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