如何解决我试图从字符串中删除反斜杠,但是如果我用 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 举报,一经查实,本站将立刻删除。