messageformat中单引号必须成对出现('')才能输出一个单引号,否则会将占位符视为字面量导致解析失败;中文单引号虽可绕过解析但不推荐。

MessageFormat 对单引号的处理有明确规则:**单个单引号不显示,必须用两个连续单引号('')表示一个实际输出的单引号**。这不是可选习惯,而是语法硬性要求。
单引号会“吃掉”占位符和周围内容
如果模式中出现未配对或未转义的单引号,MessageFormat 会将其视为字面量分隔符,导致后续占位符失效或被原样输出:
- "'{0}'" → 输出 {0}(不是 'value'),因为单引号把 {0} 整体当作文本,不解析
- "It's {0}" → 输出 Its value('s 被忽略,变成 Its)
- "It''s {0}" → 输出 It's value(两个单引号才保留一个 ')
正确转义单引号的写法
所有需要在最终结果中显示的单引号,都必须写成两个连续单引号(''):
- 普通文本中的单引号:"He said ''Hello''" → 输出 He said 'Hello'
- 包裹参数:"user_type = ''{0}''" → 输出 user_type = 'admin'
- 混在 SQL 或 HTML 模板中:"WHERE name = ''{0}'' AND status = ''active''"
花括号和单引号嵌套的特殊处理
当模板本身要输出原始花括号(如 JSON、正则表达式),需用单引号包裹整个花括号结构,并注意引号配对:
- 想输出 {code:"w1"},写成:"'{'code:\"{0}\"'}'"
- 若里面还要带单引号,比如 {code:'w1'},则写成:"'{'code:''{0}'''}'"
- 错误写法:"{code:'{0}'}" —— 单引号不配对,{0} 不会被替换
中文单引号是例外但不推荐
中文全角单引号(‘’)不会被 MessageFormat 解析为语法符号,因此能原样保留。例如:
"It’s {0}"(使用中文‘)→ 输出 It’s value
但这种写法不可靠:不同编码、字体、编辑器可能误判;国际化场景下无法保证源文件统一;也不符合 Java 社区通用规范。建议始终用英文双单引号转义。










