[bug] Win32 原生目录选择器在 U+XX00(如「开」)处截断 UTF-16 路径 — 附可 cherry-pick 修复 #580
Replies: 5 comments
|
我是外面看这条的开发者,对照了 根因说得通:UTF-16LE 的终止符是两个零字节,按 一个小建议:复现和夹具路径尽量用合成目录名,不要带真实用户目录。这条看起来就是独立的编码/FFI 修复,不像要动整个 picker。 |
|
谢谢对照 单测走的是假 COM 缓冲里的合成 UTF-16LE(含 U+5F00「开」),没有真实用户目录。复现描述里的「开」也只是这个码元的例子。picker 本身没动。 这条按独立编码/FFI 修复保持,不再扩范围。 |
|
Confirmed against master: |
|
readUtf16 用 bytes[end] !== 0 扫 UTF-16LE,把 U+XX00(开 = 00 5F)当成 NUL。这是教科书级 FFI 编码错误,不是「某个汉字」的问题。改成双字节都为 0 才停,语义正好覆盖 U+0000,不会欠终止也不会过终止。假 COM 夹具钉住 U+5F00,不依赖 Windows runner,形状对。 小建议:夹具路径仍是 C:\Users\XIAOPAN\Desktop\安卓开发。功能上无所谓(假 COM),公开仓库里换成合成名更干净。koffi.view(..., 32768) 的硬上限是原问题,别塞进这条。 |
|
夹具路径已换成合成名 commit: |
Uh oh!
There was an error while loading. Please reload this page.
摘要 / Summary
Win32 原生文件夹选择器把 UTF-16LE 路径扫成 JS 字符串时,把「低字节为 0」的 BMP 字符误判成 NUL,路径在该字符处被截断。选
C:\Users\XIAOPAN\Desktop\安卓开发会得到不存在的...\安卓,工作区创建失败。This is the same defect reported in #563. A tested one-commit fix is ready to cherry-pick.
复现 / Repro
C:\Users\XIAOPAN\Desktop\安卓开发。workspace-invalid-path: cannot create a workspace at "...\安卓": ENOENT。根因 / Root cause
packages/host/directory-picker-native/src/win32-dialog-bindings.ts的readUtf16用bytes[end] !== 0找终止符。UTF-16LE 的真正 NUL 是 两个 零字节。开= U+5F00 → 字节00 5F,低字节为 0,扫描提前结束。任何 U+XX00 码元都会从该处截断,不限于「开」。
修复 / Fix (cherry-pick ready)
官方暂不收外部 PR,补丁在 fork 上:
c8aac14703—fix(directory-picker-native): stop truncating Win32 UTF-16 paths at U+XX00终止条件改为「两个字节都为 0」。单测用假 COM 世界覆盖
安卓开发(U+5F00),不依赖真 Windows。验收 / Acceptance
pnpm exec vitest run packages/host/directory-picker-native/tests/win32-dialog-bindings.spec.ts通过。含 U+XX00 的路径不再被截断。All reactions