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)) 并查看实际字节数。这将消除关于字符串中内容的所有歧义。