这也许是一个愚蠢的问题,但我对swift很新,实际上我无法解决它。
我有一个API,它返回URL作为字符串“http:\/\/xxx<\/strong>”。 我不知道如何以此格式存储从API返回的URL。由于反斜杠,我不能将其存储到变量中。
来自Apple文档:
...字符串不能包含未转义的反斜杠(\),...
是否有任何方法可以存储这样的字符串,或者如何删除这些单个反斜杠,或如何处理这个问题?
感谢您的每一个建议。
你可以直接替换那些反斜杠,例如:
let string2 = string1.stringByReplacingOccurrencesOfString("\\", withString: "")
或者,为了避免在正常字符串字面值中反斜杠需要用另一个反斜杠转义的混淆,我们可以使用扩展字符串分隔符#"
和"#
:
let string2 = string1.stringByReplacingOccurrencesOfString(#"\"#, withString: "")
但是,如果可能的话,你真的应该修复返回这些反斜杠的API,因为显然这是不正确的。那段代码的作者显然误认为必须对正斜杠进行转义,但实际上并非如此。
总之,应该修复API以便不插入这些反斜杠,但在此之前,您可以使用上述方法来删除可能出现的任何反斜杠。
注意,字符串字面值只是您代码中特定固定字符序列的表示。但是,这不应与底层的String对象本身混淆。字符串字面值和底层的String对象之间的关键区别在于,字符串字面值允许使用反斜杠作为“转义”字符,用于表示特殊字符(或进行字符串插值)。正如文档所述:您可以将预定义的
String
值作为字符串字面量包含在代码中。字符串字面量是由一对双引号(""
)括起来的固定文本字符序列。
\0
(空字符)、\\
(反斜杠)、\t
(水平制表符)、\n
(换行符)、\r
(回车符)、\"
(双引号)和 \'
(单引号)\u{n}
,其中 n
是一个 1 到 8 位十六进制数,表示一个有效的 Unicode 代码点\\
来表示它。stringByReplacingOccurrencesOfString
的意思是“查找 string1
中的所有单个反斜杠,并将它们替换为一个空字符串(即删除反斜杠)”。let string1 = "foo\\bar"
print(string1) // this will print "foo\bar"
print(string1.characters.count) // this will print "7", not "8"
let string2 = string1.stringByReplacingOccurrencesOfString("\\", withString: "")
print(string2) // this will print "foobar"
print(string2.characters.count) // this will print "6"
string1
,它将显示一个字符串文字表示(即反斜杠将显示为"\\"
)。但不要困惑。当您在字符串文字中看到\\
时,实际上实际字符串中只有一个反斜杠。但是,如果您print
该值或查看实际字符,则字符串本身中仅有一个反斜杠。stringByReplacingOccurrencesOfString
的参数)和基础字符串中存在的单个反斜杠。string1.stringByReplacingOccurrencesOfString("\\", withString: "")
确实会用 "" 替换单个反斜杠的出现。在字符串字面量中指定“单个反斜杠”的方式是 "\"。 - Rob'
字符,因此这个问题有些无关紧要。其次,如果在进行SQL操作时,应该避免通过构建字符串来插入值,而是应该使用 ?
占位符,例如 insert into Users (emailId, password) values (?, ?)
然后通过SQLite API将值绑定到这两个占位符中。 - Rob在尝试将对象编码为JSON时,我发现我也遇到了同样的问题。根据你是否正在使用较新的JSONEncoder
类来解析JSON,并且你支持iOS 13的最小版本,你可以使用.withoutEscapingSlashes
输出格式:
let encoder = JSONEncoder()
encoder.outputFormatting = .withoutEscapingSlashes
try encoder.encode(yourJSONObject)
let jsonStr = "[{\"isSelected\":true,\"languageProficiencies\":[{\"isSelected\":true,\"name\":\"Advance\"},{\"isSelected\":false,\"name\":\"Proficient\"},{\"isSelected\":false,\"name\":\"Basic\"},{\"isSelected\":false,\"name\":\"Below Basic\"}],\"name\":\"English\"},{\"isSelected\":false,\"languageProficiencies\":[{\"isSelected\":false,\"name\":\"Advance\"},{\"isSelected\":false,\"name\":\"Proficient\"},{\"isSelected\":false,\"name\":\"Basic\"},{\"isSelected\":false,\"name\":\"Below Basic\"}],\"name\":\"Malay\"},{\"isSelected\":false,\"languageProficiencies\":[{\"isSelected\":false,\"name\":\"Advance\"},{\"isSelected\":false,\"name\":\"Proficient\"},{\"isSelected\":false,\"name\":\"Basic\"},{\"isSelected\":false,\"name\":\"Below Basic\"}],\"name\":\"Chinese\"},{\"isSelected\":false,\"languageProficiencies\":[{\"isSelected\":false,\"name\":\"Advance\"},{\"isSelected\":false,\"name\":\"Proficient\"},{\"isSelected\":false,\"name\":\"Basic\"},{\"isSelected\":false,\"name\":\"Below Basic\"}],\"name\":\"Tamil\"}]"
let convertedStr = jsonStr.replacingOccurrences(of: "\\", with: "", options: .literal, range: nil)
print(convertedStr)
let convertedStr = jsonString.replacingOccurrences(of: "\\/", with: "/")
为了删除单个反斜杠,请尝试使用以下方法
let replaceStr = backslashString.replacingOccurrences(of: "\"", with: "")
通过添加额外的反斜杠在字符串中包含反斜杠。
var str = "http:\/\/"
,或者我漏掉了什么? - marysmech
#"带有反斜杠的字符串"#
。 - onmyway133