MessageFormat.format中花括号必须用单引号转义,如'{'}'输出};变量值含花括号时需预处理替换为'{'}'和'{'}';{{不推荐作转义;单引号是唯一转义机制,不支持反斜杠。

MessageFormat.format 处理变量中的花括号时,核心规则是:花括号 { 和 } 是占位符语法的边界符号,不能直接出现在模式字符串中——除非显式转义。否则会触发 IllegalArgumentException: Unmatched braces 或解析失败。
花括号必须用单引号包裹才能作为普通文本输出
想在最终结果里显示一个左花括号 {,就得写成 '{';显示右花括号 },就得写成 '}'。注意:这不是加反斜杠,而是用一对英文单引号把花括号包起来。
-
MessageFormat.format("参数是{'{'}{0}{'}'},", "abc")→ 输出:参数是{abc}, - 错误写法:
"参数是{ {0} }"会被当成非法占位符,报错 - 连续两个花括号
{{不是转义方式,{{会被当作字面量{解析(但仅限于非占位符上下文,实际行为不稳定,不推荐)
变量值本身含花括号时,需提前对变量内容做转义
如果传入的参数(比如 args[0])本身是字符串 "{id:123}",而你又希望它原样插入到消息中,就不能直接用 {0}——因为 MessageFormat 在解析阶段就可能因参数里的 { 导致匹配混乱或报错。
- 安全做法:对外部输入的参数预先清理,将其中的
{替换为'{',}替换为'}',单引号替换为两个单引号'' - 例如:
String safeValue = rawValue.replace("{", "'{'").replace("}", "'}").replace("'", "''"); - 再传入:
MessageFormat.format("详情:{0}", safeValue)
嵌套占位符或动态模板场景要格外小心
当消息模板本身是从配置、数据库或上游服务动态获取时(比如 "用户{0}执行了{1}"),若该模板字符串里已含未转义的花括号,就会在 MessageFormat.format() 调用时直接崩溃。
- 读取模板后,建议先校验是否含未配对花括号,或统一做预处理:对所有孤立的
{和}补上单引号 - 避免拼接生成模板,比如
"{" + var + "}"—— 这极易引入语法错误 - 如需表达字面量
{0}(即不解析,就当普通文本),应写作'{'0'}'
单引号是唯一且不可替代的转义机制
MessageFormat 不支持反斜杠 \ 转义花括号,也不接受双引号包裹来规避。它的转义体系完全基于单引号语义:
- 一个单引号
'开启/关闭“文本模式”,其内所有内容(包括{、}、')均不参与占位符解析 - 两个连续单引号
''表示输出一个单引号字符 -
'{0}'→ 输出字面量{0}(不是替换) -
''{0}''→ 输出'{0}'(先转义单引号,再保留占位符)

















