API调用返回字面量出现无效转义序列导致Xcode报错如何解决
问题规避方案
你遇到的是转义字符\f(ASCII换页符,Unicode编码为U+000C)的兼容问题,分两种场景对应不同处理方法:
场景1:将API返回的字符串复制到代码中作为字面量使用时报错
Swift字符串字面量默认会解析转义序列,部分版本的Xcode/Swift对\f的字面量转义支持不完整,你可以改用原始字符串字面量来避免编译器校验转义:
// 用#包裹字符串,内部的\f会被当成普通字符处理,不会触发转义校验 let apiResponseStr = #"Spits fire that\nis hot enough to\nmelt boulders.\fKnown to cause\nforest fires\nunintentionally"#
场景2:线上运行时请求API返回数据转String/JSON解码时崩溃
你可以在本地加一层数据预处理,不需要后端调整接口,就可以完全规避崩溃:
- 方案1:解码后过滤非法控制字符,保留正常的
\n等转义符
guard let rawStr = String(data: responseData, encoding: .utf8) else { // 编码不匹配的兜底处理 return } // 仅过滤换页符,不影响其他正常内容 let safeStr = rawStr.replacingOccurrences(of: "\u{000C}", with: "") // 如果要过滤所有不可见控制字符可以用:rawStr.filter{!$0.isControl}
- 方案2:JSON解码前预处理原始Data,解决后端返回非法JSON的问题
如果是后端返回的JSON未正确转义\f导致JSON解析失败,可以先替换Data中的换页符再做解码:
var processedData = responseData if let rawStr = String(data: responseData, encoding: .utf8) { let replacedStr = rawStr.replacingOccurrences(of: "\u{000C}", with: "") processedData = replacedStr.data(using: .utf8) ?? responseData } // 用processedData进行后续JSON解码操作
- 方案3:使用更宽松的字符串转换方式,避免强制转换崩溃
// 用NSString的转换接口,遇到不识别字符时会自动兼容,不会直接返回nil let safeStr = NSString(data: responseData, encoding: String.Encoding.utf8.rawValue) as? String ?? ""
内容的提问来源于stack exchange,提问作者Luis Ramirez
相关产品推荐
相关产品推荐

