[跟踪问题] 集成 ICU4X 以改进 satori 中的 Unicode 文本处理
作者: Vizards创建于 2026年3月30日更新于 2026年3月30日
□ 背景情况
Satori目前的文本处理堆栈依赖于几个独立的库和运行时间 API,每个库都有已知的限制:
- QQ [email protected]`**: Unicode 支持在 Unicode 13 (2020) 上被停滞; 包已超过4年没有 npm 发布, 无法正确处理 Emoji ZWJ 序列或复杂的脚本行断 (参见问题 # 687, # 621)
- 内特 分机:在JavaScript运行时间执行上重现,在V8、JSC、SpiderMonkey和各种边缘运行时间上的表现不一致——并且完全在一些环境中不支持 {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080} - - emoji - regex -xs - - {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080} - {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080} - {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080} - 需要手动更新以跟踪新的 Unicode 版本; ICU4X 的 Emoji 属性查询可以覆盖同样的功能, 同时消除这种外部依赖性 —— 很高兴与维护者讨论替换是否值得
- ** 语言中的脚本检测: 每个语言的硬码正则克塞斯语,其比例不高
- ** 完全没有某些能力**(例如,BiDi/右到左文本布局)
ICU4X是Unicode Consortium的下一代国际化图书馆,已经被Firefox,Chrome,和Android所采用. 它提供了一个WebAssembly的构建,能够以决定、运行时间和不可知的方式解决上述所有问题。
这一问题跟踪了ICU4X通过一个配套的 " icu4satori " 软件包逐步融入Satori的情况。
□ 拟议办法
核心设计原理为:不突破变化,完全向后兼容.
一个可选的“文本引擎? ” : 文本引擎字段被添加到“ Satori 选项” 中, 允许将 ICU4X 作为插件注入。 未通过“文本引擎”的用户的行为没有任何变化。
从 “ icu4satori” 导入 { init, 创建 TextEngine } 从“ satori” 导入 satori
等待输入( 输入) cont textEngine = 创建 TextEngine( 新的 Uint8Array (dataBlob) )
svg = 等待 satori (
สวัสดีชาวโลก
,{
宽度: 600,
身高:400, 内侧:
字体: [.], ;
textEngine, // 选择加入 ICU4X; 省略回溯到已存在的行为
) (中文(简体) ).
ICU4X WASM二进制(~96 KB)和Unicode数据blob(~348 KB)作为单独的子路径出口在"icu4satori"包内被分配,并在运行时按需加载.
∮ 工作崩溃了∮
第1阶段:换行(进行中)
> 执行草案已准备就绪——见#744
** 问题**:`断线@1.1'被冻结在Unicode 13,不支持:
- Emoji ZWJ序列(例如:QQ在行尾不能正确断开)
- 泰语、缅甸语和高棉语的单词平分线(SA级字符降解为字符平分线)
- CSS " 断行:严格/放行 " 对CJK文本的正确行为
** 拟议解决办法**:采用 " icu4satori " 包装ICU4X`LineSecmenter " (UAX#14 v15.1+)。 在提供“文本引擎”时,将可选的“文本引擎”字段添加到“toari options”中,并通过“textEngine.getLineBreaks()”添加“SplitByBreak Opportities()”中。
** 计划交付成果**:
- " icu4satori " 包:`init()'
. . . . . . .内容来源: vercel/satori