You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

带参数本地化字符串内容缺失及Xcode控制台输出异常问题

解决本地化格式化字符串丢失内容及控制台打印异常问题

问题分析

你遇到的两个问题本质是同一个原因:格式化字符串中的转义双引号导致String(format:)解析异常。

  • 当本地化字符串包含\"%@\"?时,String(format:)会将\"解析为字面双引号,替换%@后,字符串结构被误判——引擎会把中间的双引号视为字符串闭合标记,导致后续的?"被丢弃,甚至触发未定义行为(后续打印内容消失)。

解决方案

提供两种可行的修复方案,按需选择:

方案1:将双引号移至参数中(推荐)

这种方式更符合格式化字符串的设计逻辑,避免转义字符带来的解析问题:

  1. 修改本地化文件内容:
"forget_title" = "Forget %@?";
  1. 修改Swift中的本地化属性默认值:
static var forget_title: String { 
    return NSLocalizedString("forget_title", value: "Forget %@?", comment: "forget title") 
}
  1. 使用时传入带引号的参数:
let name = "XYZ"
let bannerHeader = String(format: .forget_title, "\"\(name)\"")
print(bannerHeader) // 输出:Forget "XYZ"?

方案2:使用双重转义保留字符串中的引号

如果必须在本地化字符串中保留引号结构,需要用双重反斜杠来转义,确保String(format:)正确识别:

  1. 修改本地化文件内容:
"forget_title" = "Forget \\\"%@\\\"?";
  1. 修改Swift中的本地化属性默认值:
static var forget_title: String { 
    return NSLocalizedString("forget_title", value: "Forget \\\"%@\\\"?", comment: "forget title") 
}
  1. 保持原调用方式不变即可得到正确结果:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 11:15:27