微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我试图从字符串中删除反斜杠,但是如果我用 print 打印出来,我会得到正确的字符串,但是如果我用“po”打印它,我会得到相同的字符串

如何解决我试图从字符串中删除反斜杠,但是如果我用 print 打印出来,我会得到正确的字符串,但是如果我用“po”打印它,我会得到相同的字符串

MyString = "CfegoAsZEM/sP\u{10}\u{10}}"
MyString.replacingOccurrences(of: "\"",with: "")

使用 print(MyString) 我得到了这个:"CfegoAsZEM/sP"(这就是我需要的) 使用 po MyString(在调试器上):"CfegoAsZEM/sP\u{10}\u{10}}"

解决方法

\u{10} 是换行符

也许更好的方法是 trim 字符串,它从字符串的开头和结尾删除所有空格和换行符

let myString = "CfegoAsZEM/sP\u{10}\u{10}"
let trimmedString = myString.trimmingCharacters(in: .whitespacesAndNewlines)
,

您的字符串不包含文字反斜杠字符。相反,\u{} 序列是一个引入 Unicode 字符的转义序列。这就是您无法使用 replacingOccurrences 删除它的原因。

在这种情况下,正如 Vadian 指出的那样,它是“换行”字符 (0x10)。由于这是一个不可见的“空白”字符,因此您在 print 字符串时看不到它,但在使用 po 时确实会看到它。调试器向您显示不可打印字符的转义序列。如果您print(MyString.debugDescription)

不幸的是,trimmingCharactersIn 函数似乎没有考虑 Unicode 序列。

我们可以使用 filter 函数来检查字符串中的每个字符。如果字符是 ASCII 并且具有大于 31 的值(32 是空格字符,ASCII 序列中的第一个“可打印”字符),我们可以包含它。我们还需要确保包含非 ASCII 值,以免剥离可打印的 Unicode 字符(例如表情符号或非拉丁字符)。

let MyString = "CfegoAsZEM/sP\u{10}\u{13}$}?\u{1F600}".filter { $0.asciiValue ?? 32 > 31 }
print(MyString.debugDescription)
print(MyString)

输出

“CfegoAsZEM/sP}??”

CfegoAsZEM/sP}??

asciiValue 返回一个可选的,如果字符不是纯 ASCII,则为 nil。在这种情况下,我使用了 nil-coalescing 运算符返回 32,这样字符就不会被过滤。

我修改了初始字符串以包含一些可打印的 Unicode,以证明它没有被过滤器剥离。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。