Swift 字符串文字 - 删除转义反斜杠
Swift string literal - remove escaping back slashes
我的情况是后端生成它传递给应用程序的字符串的哈希值,并且无法控制后端的哈希值生成。我需要生成相同的字符串以将其传递给应用程序的哈希验证算法,这就是问题所在:
为验证而传递的字符串需要如下所示:
[{"crawlLogic":{"startURL":"https://somesite.com/start","someParam":"\r\n\r\n/** Retrieves element's text either by class name" ....
这里的问题是正在验证的字符串需要符合2个条件:
1. 没有反斜杠转义双引号(如 [{\"crawlLogic\":{\"startURL\":\"https://somesite.com/start\"
)
2. 有带转义符的换行符和制表符,但实际上没有将它们变成制表符和换行符。
当我设置断点并检查字符串文字时,我当然会看到那些反斜杠。但是当我在控制台中打印一个字符串时,我看到 \n
变成了新行。
我假设它将字符串文字作为验证的实际值,因此我的问题是如何删除字符串文字中的那些反斜杠?
我为什么或怎么知道这个?因为在 Android 中,就在传入字符串之前,我确实看到了这个字符串。
字符串的来源
这是一个 JSON 自定义编码器,字符串编码如下所示:
private func encode(_ value: JSON, depth: Int) throws -> String {
switch value {
case let .string(string):
let zeString = #""\#(string)""#
return zeString
case let .number(digits): return digits
case let .bool(value): return value ? "true" : "false"
case let .object(object): return try encode(object: object, depth: depth)
case let .array(array): return try encode(array: array, depth: depth)
case .null: return "null"
}
}
这样我就可以去除打印字符串中的反斜杠,但是如何保留 \n \r 呢?
您可能会混淆 IDE 显示字符串的方式和实际打印的字符串。设置断点并查看调试器将向您显示 C 转义字符串。如果您打印这些值,转义将消失。例如,如果我创建您描述的文字字符串:
let string = #"[{"crawlLogic":{"startURL":"https://somesite.com/start","someParam":"\r\n\r\n/** Retrieves element's text either by class name""#
调试器将打印此值的 debugDescription
,其中包括转义(例如 \"
和 \r
,请注意双反斜杠):
print(string.debugDescription)
"[{\"crawlLogic\":{\"startURL\":\"https://somesite.com/start\",\"someParam\":\"\r\n\r\n/** Retrieves element\'s text either by class name\""
但是那些额外的转义实际上并不在字符串中:
print(string)
[{"crawlLogic":{"startURL":"https://somesite.com/start","someParam":"\r\n\r\n/** Retrieves element's text either by class name"
如果 debugDescription
有 \r
而不是 \r
,那么这表明你的字符串中有回车 return (UTF-8: 0x0d),而不是\r
(UTF-8:0x5c 0x72)。如果您需要将回车符 return + 换行符转换为 \r\n
,那么您可以使用 replaceOccurrences(of:with:)
.
string.replaceOccurrences(of: "\r\n", with: #"\r\n"#)
这表示用“反斜杠 r 反斜杠 n”替换字符串“carriage return, newline”。
(但我会首先调查为什么字符串以错误的形式开始。我猜你在某些时候用 "\r\n"
构造它,而你的意思是 #"\r\n"#
或"\r\n"
。或者你可能在不应该转义的时候转义了一个字符串。转义和转义字符串非常棘手。首先尝试构建字符串来保存你想要的字符,而不是尝试稍后修复。)
如果您仍然遇到问题,我建议您将字符串转换为 UTF-8 (Array(string.utf8)
) 并查看实际字节数。这将消除关于字符串中内容的所有歧义。
我的情况是后端生成它传递给应用程序的字符串的哈希值,并且无法控制后端的哈希值生成。我需要生成相同的字符串以将其传递给应用程序的哈希验证算法,这就是问题所在: 为验证而传递的字符串需要如下所示:
[{"crawlLogic":{"startURL":"https://somesite.com/start","someParam":"\r\n\r\n/** Retrieves element's text either by class name" ....
这里的问题是正在验证的字符串需要符合2个条件:
1. 没有反斜杠转义双引号(如 [{\"crawlLogic\":{\"startURL\":\"https://somesite.com/start\"
)
2. 有带转义符的换行符和制表符,但实际上没有将它们变成制表符和换行符。
当我设置断点并检查字符串文字时,我当然会看到那些反斜杠。但是当我在控制台中打印一个字符串时,我看到 \n
变成了新行。
我假设它将字符串文字作为验证的实际值,因此我的问题是如何删除字符串文字中的那些反斜杠?
我为什么或怎么知道这个?因为在 Android 中,就在传入字符串之前,我确实看到了这个字符串。
字符串的来源 这是一个 JSON 自定义编码器,字符串编码如下所示:
private func encode(_ value: JSON, depth: Int) throws -> String {
switch value {
case let .string(string):
let zeString = #""\#(string)""#
return zeString
case let .number(digits): return digits
case let .bool(value): return value ? "true" : "false"
case let .object(object): return try encode(object: object, depth: depth)
case let .array(array): return try encode(array: array, depth: depth)
case .null: return "null"
}
}
这样我就可以去除打印字符串中的反斜杠,但是如何保留 \n \r 呢?
您可能会混淆 IDE 显示字符串的方式和实际打印的字符串。设置断点并查看调试器将向您显示 C 转义字符串。如果您打印这些值,转义将消失。例如,如果我创建您描述的文字字符串:
let string = #"[{"crawlLogic":{"startURL":"https://somesite.com/start","someParam":"\r\n\r\n/** Retrieves element's text either by class name""#
调试器将打印此值的 debugDescription
,其中包括转义(例如 \"
和 \r
,请注意双反斜杠):
print(string.debugDescription)
"[{\"crawlLogic\":{\"startURL\":\"https://somesite.com/start\",\"someParam\":\"\r\n\r\n/** Retrieves element\'s text either by class name\""
但是那些额外的转义实际上并不在字符串中:
print(string)
[{"crawlLogic":{"startURL":"https://somesite.com/start","someParam":"\r\n\r\n/** Retrieves element's text either by class name"
如果 debugDescription
有 \r
而不是 \r
,那么这表明你的字符串中有回车 return (UTF-8: 0x0d),而不是\r
(UTF-8:0x5c 0x72)。如果您需要将回车符 return + 换行符转换为 \r\n
,那么您可以使用 replaceOccurrences(of:with:)
.
string.replaceOccurrences(of: "\r\n", with: #"\r\n"#)
这表示用“反斜杠 r 反斜杠 n”替换字符串“carriage return, newline”。
(但我会首先调查为什么字符串以错误的形式开始。我猜你在某些时候用 "\r\n"
构造它,而你的意思是 #"\r\n"#
或"\r\n"
。或者你可能在不应该转义的时候转义了一个字符串。转义和转义字符串非常棘手。首先尝试构建字符串来保存你想要的字符,而不是尝试稍后修复。)
如果您仍然遇到问题,我建议您将字符串转换为 UTF-8 (Array(string.utf8)
) 并查看实际字节数。这将消除关于字符串中内容的所有歧义。