带参数本地化字符串内容缺失及Xcode控制台输出异常问题
解决本地化格式化字符串丢失内容及控制台打印异常问题
问题分析
你遇到的两个问题本质是同一个原因:格式化字符串中的转义双引号导致String(format:)解析异常。
- 当本地化字符串包含
\"%@\"?时,String(format:)会将\"解析为字面双引号,替换%@后,字符串结构被误判——引擎会把中间的双引号视为字符串闭合标记,导致后续的?"被丢弃,甚至触发未定义行为(后续打印内容消失)。
解决方案
提供两种可行的修复方案,按需选择:
方案1:将双引号移至参数中(推荐)
这种方式更符合格式化字符串的设计逻辑,避免转义字符带来的解析问题:
- 修改本地化文件内容:
"forget_title" = "Forget %@?";
- 修改Swift中的本地化属性默认值:
static var forget_title: String { return NSLocalizedString("forget_title", value: "Forget %@?", comment: "forget title") }
- 使用时传入带引号的参数:
let name = "XYZ" let bannerHeader = String(format: .forget_title, "\"\(name)\"") print(bannerHeader) // 输出:Forget "XYZ"?
方案2:使用双重转义保留字符串中的引号
如果必须在本地化字符串中保留引号结构,需要用双重反斜杠来转义,确保String(format:)正确识别:
- 修改本地化文件内容:
"forget_title" = "Forget \\\"%@\\\"?";
- 修改Swift中的本地化属性默认值:
static var forget_title: String { return NSLocalizedString("forget_title", value: "Forget \\\"%@\\\"?", comment: "forget title") }
- 保持原调用方式不变即可得到正确结果:
let name = "XYZ" let bannerHeader = String(format: .forget_title, name) print(bannerHeader) // 输出:Forget "XYZ"?
验证测试
修改后执行测试代码,无论打印顺序如何,都会输出正确内容,且后续打印不会消失:
let name = "XYZ" let bannerHeader = String(format: .forget_title, name) print("Header - \(bannerHeader)") print("Header - \(String.forget_title)") // 测试其他字符串 let string = "hello \\\"%@\\\"?" let someString = String(format: string, "test") let newString = "hello %@?" let someOtherString = String(format: newString, "\"test\"") print("Header - \(someString)") print("Header - \(someOtherString)")
预期输出:
Header - Forget "XYZ"? Header - Forget %@? // 或 Forget \"%@\"?(取决于所选方案) Header - hello "test"? Header - hello "test"?
内容的提问来源于stack exchange,提问作者Chinmay Balutkar
相关产品推荐
相关产品推荐

