一个不可见空格可能改变 ICU 分支
结合已解决的 NBSP 讨论,区分不可见语法字符、合法文字空白和真正缺失的 other 分支。
复制的消息没有说明全部问题
原提问中的嵌套消息看似有效,但作者随后定位到语法 token 之间的 NBSP U+00A0,撤回了解析器缺陷说法。维护者确认此处无效,文字中的 NBSP 仍可保留。作者最后希望警告能暴露复制进来的不可见空白。
因此,missing other 错误需要原文证据。先检查错误偏移处及附近不可见字符,再决定补分支或换解析器。不要统一替换所有空白,这可能改变合法文字输出。
- 保留失败系统中的消息和参数 JSON 原件。
- 核对成熟语法错误码、原始行列及 U+00A0 字节位置。
- 明确修改该字符,用相同 locale 和参数类型重试。
- 保存两份原件及完整渲染文本,供接收方运行时复现。
选定明确的数值与 locale 合同
参数仅为标量 Unicode 字符串或数学上精确的安全整数,范围 −9,007,199,254,740,991 至 9,007,199,254,740,991,先检查原始数值 token 再转为 JavaScript Number。小数或科学记数形式只有值确为整数时才可用。计数、offset 和 =选择器须非负。 显式 =选择器仅使用规范十进制写法:=0 或 =[1-9][0-9]*,不带加号、前导零或 −0。
拒绝分数值、日期/时间、样式、骨架、货币、富文本标签/尖括号、MF2 声明、回调和解析器回调。所有 AST 分支均检查必需参数和类型,未选中的分支也检查;合法但未使用的标量参数列入报告。
普通数值参数采用 FormatJS String(value) 语义,number 和 # 采用本浏览器 Intl locale 数据。运行时数据变化可改变结果,不承诺与所有 ICU4J 语义兼容。语法错误显示成熟错误码、原文 UTF16 偏移/行/列、UTF8 字节偏移和附近 U+00A0 位置;不会自动修复 NBSP。
消息:{n} / {n, number}
JSON:{"n":12345}
Locale:en-US
文本:12345 / 12,345预览需要完整证据
允许 20,000 个 AST 节点、65 层未引用语法花括号、1,000 个参数名;每名 128 UTF8 字节,每字符串值 65,536 UTF8 字节。被单引号引用的文字花括号不计语法深度。
完整渲染文本允许 8 MiB UTF8。屏幕只预览 4,000 个 Unicode 码点;原生复制和 rendered-message.txt 均保留全文。下载两份原件和完整参数元信息报告;报告中的不可见字符位置明确只预览前 200 项。
校验全部分支中的参数,包括当前值没有选中的分支。前 4,000 码点截图不能替代完整文本和不变原件。报告明确将前 200 个不可见字符位置标为辅助预览;全部参数名与用途仍完整。
| 证据 | 检查 |
|---|---|
| 原始消息 | 没有静默修复 NBSP;记录传输 BOM 移除 |
| 参数 JSON | 解码键唯一;整数精确;全部分支类型正确 |
| Locale 与运行时 | 明确枚举;接收运行时 Intl 数据可能不同 |
| 完整文本 | 复制或下载全文,而非只有屏幕预览 |
参考资料
- ICU 语法中的复制不可见空白
作者定位语法 NBSP 后撤回最初解析器缺陷说法,仍希望得到可见警告。已阅读三个原例和全部六条评论;网页偏好与需求规模未知。
- FormatJS 解释式 MessageFormat AST
本工具只支持明确的纯文本 MF1 合同和运行时 Intl,不承诺完整 ICU4J 兼容、富文本标签或 MF2。
- ICU MessageFormat1 语法
select/plural other、offset、# 与可选单引号引用;样式及日期/时间不在本合同内。
本分类工具使用说明
展开工具,查看操作步骤、可调选项和支持范围,再直接进入工作区。
预览 ICU MessageFormat1在本地渲染嵌套 ICU select 与 plural 消息,并用原始位置定位语法中的不可见字符。
在本地渲染嵌套 ICU select 与 plural 消息,并用原始位置定位语法中的不可见字符。
操作步骤
- 粘贴消息或选择一份原始 UTF8 消息文件,再粘贴具名参数 JSON。
- 选择明确的 locale,用正确参数类型预览并校验全部分支。
- 语法拒绝时核对成熟错误码和可见码点位置,明确修改原文后重试。
- 交接前复制或下载完整文本、两份不变原件及参数报告。
可调选项
- Locale
- en-US · en-GB · zh-CN · fr-FR · ru-RU · ar-EG
使用本浏览器明确的 locale 数据;默认 en-US。
能力与限制
- 粘贴消息,或选择至多一个严格 UTF8 消息文件,上限 1 MiB。文件仅替代主消息,次输入的参数 JSON 仍需粘贴,上限也是 1 MiB。原始文件名标签允许 512 UTF8 字节。
- 每个输入至多移除一个起始 UTF8 BOM,明确作为传输标记记录;下载保留两份原始字节。拒绝损坏 UTF8、原始或 JSON 转义的未配对 Unicode 代理码。解码后重复参数键使整次处理拒绝。
- 选择 en-US、en-GB、zh-CN、fr-FR、ru-RU 或 ar-EG,默认 en-US。支持文字、可选单引号引用、普通参数、select、基数 plural、selectordinal、offset、=选择器、# 和无样式 number。每个 select/plural 必须有 other。
- 参数仅为标量 Unicode 字符串或数学上精确的安全整数,范围 −9,007,199,254,740,991 至 9,007,199,254,740,991,先检查原始数值 token 再转为 JavaScript Number。小数或科学记数形式只有值确为整数时才可用。计数、offset 和 =选择器须非负。 显式 =选择器仅使用规范十进制写法:=0 或 =[1-9][0-9]*,不带加号、前导零或 −0。
- 拒绝分数值、日期/时间、样式、骨架、货币、富文本标签/尖括号、MF2 声明、回调和解析器回调。所有 AST 分支均检查必需参数和类型,未选中的分支也检查;合法但未使用的标量参数列入报告。
- 允许 20,000 个 AST 节点、65 层未引用语法花括号、1,000 个参数名;每名 128 UTF8 字节,每字符串值 65,536 UTF8 字节。被单引号引用的文字花括号不计语法深度。
- 完整渲染文本允许 8 MiB UTF8。屏幕只预览 4,000 个 Unicode 码点;原生复制和 rendered-message.txt 均保留全文。下载两份原件和完整参数元信息报告;报告中的不可见字符位置明确只预览前 200 项。
- 普通数值参数采用 FormatJS String(value) 语义,number 和 # 采用本浏览器 Intl locale 数据。运行时数据变化可改变结果,不承诺与所有 ICU4J 语义兼容。语法错误显示成熟错误码、原文 UTF16 偏移/行/列、UTF8 字节偏移和附近 U+00A0 位置;不会自动修复 NBSP。