Skip to content

fix(web): 导出文件名按码点截断,避免拆开 emoji - #494

Open
Qiyuanqiii wants to merge 4 commits into
mainfrom
Qiyuanqiii/thread-export-unicode-filename
Open

Qiyuanqiii wants to merge 4 commits into
mainfrom
Qiyuanqiii/thread-export-unicode-filename

Conversation

@Qiyuanqiii

Copy link
Copy Markdown
Member

线程导出文件名原先用 .slice(0, 100) 按 UTF-16 码元截断。标题为 99 个 ASCII 字符加一个 emoji 时,第 100 个码元正好是 emoji 的高代理项,截断后会留下单独的高代理项,下载文件名中出现替换字符。另一个边界是截断点恰好落在空格或点上:原代码先清理尾随分隔符再截断,截断又会重新制造一个以空格或点结尾的文件名,这在 Windows 上不合法。

修复改为先完成非法字符替换和 trim,再按码点截断([...clean].slice(0, 100).join("")),最后再清理一次尾随空格和点。上传附件的文件名整理已经采用同样的码点截断写法(web/src/api/client/domains/workspaces.ts:126),导出路径现在与它一致。

回归用例在同一个标题上覆盖两个边界:

  • 99 个 a + 😀 + suffix:旧实现最后一个码元是单独的高代理项 d83d,新实现保留完整 emoji。
  • 99 个 a + 空格 + tail:旧实现结尾是空格("aa "),新实现结尾是 "aaa"。

验证:

  • npx vitest run src/v2/thread-export.test.ts:12/12 通过;同一用例在旧实现下失败(期望完整 emoji,实际为单独高代理项)
  • 全量 npx vitest run:268 个文件、2608 个用例全部通过
  • npm run typecheck:通过
  • npm run build:通过
  • OCR delegate 复核:1 个可复核文件(共 2 个,测试文件被默认路径规则排除),按规则组自查无发现;排除的测试文件已手工复核

边界:没有在真实浏览器里实际触发下载;不同浏览器和文件系统对残留非法字符的兜底不在本次范围。100 个码点的长度上限保持不变,也没有改为按字节数限制。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants