返回 Bug 清单
BUG-0461project-02中已修复frontend-logic
小程序页面被多重有损编码转换(75 个私用区占位符 + 48 处被吞字符)→ 12 个页面 JS 语法非法、界面文案全乱码
发现:2026-10-04验证:2026-10-09置信度:85%
症状
界面文案乱码(审批通过→`瀹℃壒閫氳繃`、加载中→`鍔犺浇涓?`、待审核→`寰呭鎵?`);39 个 `.js` 中 **12 个 `node --check` 失败**(在 HEAD 上即失败):`SyntaxError: Invalid or unexpected token`;wxml 模板标签不配平(7 文件 13 处缺 `<`);3 条仅存损坏实现的路由(`clients/detail`、`reports/income`、`vouchers/detail`)运行期打不开。
根因
早期导入时 UTF-8 字节被当 CP936(GBK) 解读,且**有损**:(1) 无法映射的字节被替换为私用区占位符 `U+E000–U+F8FF`,原文永久丢失;(2) GBK 非法字节对(首字节后随 ASCII `< 0x40`:引号 `"`、连字符 `-`、数字、尖括号 `<`)被整体替换为 `?` 并吞掉后随字符 → 字符串闭合引号/标签尖括号丢失。同时同一路由存在“扁平 `pages/x/y.js`”与“目录 `pages/x/y/index.js`”两套实现,`app.json` 注册的页面都解析到**合法的扁平文件**,损坏的目录式副本因此长期未被发现;全仓库(Dockerfile/compose/deploy/scripts/CI/tests)对小程序的引用为 0,没有任何构建或检查覆盖它。
修复方案
三类处置并全部验证:(1) 可逆部分(段 GBK 字节数为 3 的倍数)批量反解;(2) 不可逆部分(PUA/被吞字符)用**锚点重建** —— 按 ASCII 字段锚点定位后替换为按上下文推断的中文,被吞的闭合引号自动补回;能反向校验的一律校验(借方科目先猜 `银行存款`,用前缀解码得到 `应收账` 后纠正为 **应收账款**);(3) 有合法扁平同名实现的 4 个影子副本**直接复制扁平文件为权威内容**,不做推断。另补 wxml 缺失的 `<`。最后补 CI 门禁防复发。
```python
# 不可逆乱码的判据(按可靠性)
PUA = r'[\ue000-\uf8ff]' # ① 私用区占位符
'€' in s and 中文字数 >= 2 # ② € 夹在中文里(UTF-8 被 CP936 误解的产物)
r'[\u2e80-\u9fff]\?' # ③ 中文后紧跟半角 ?(后随字符被吞)
s.encode('gbk') # ④ 长度为 3 的倍数 → 可 decode('utf-8') 还原
# ⑤ 前缀可解出 ≥2 中文且余 1–2 字节 → 有损,需语义重建
# wxml 闭合标签缺 '<'
re.compile(r'(?<=[^\x00-\x7f])/([a-zA-Z][\w-]*)>').sub(r'</\1>', t)
```
修复命令
三类处置并全部验证:(1) 可逆部分(段 GBK 字节数为 3 的倍数)批量反解;(2) 不可逆部分(PUA/被吞字符)用**锚点重建** —— 按 ASCII 字段锚点定位后替换为按上下文推断的中文,被吞的闭合引号自动补回;能反向校验的一律校验(借方科目先猜 `银行存款`,用前缀解码得到 `应收账` 后纠正为 **应收账款**);(3) 有合法扁平同名实现的 4 个影子副本**直接复制扁平文件为权威内容**,不做推断。另补 wxml 缺失的 `<`。最后补 CI 门禁防复发。
```python
# 不可逆乱码的判据(按可靠性)
PUA = r'[\ue000-\uf8ff]' # ① 私用区占位符
'€' in s and 中文字数 >= 2 # ② € 夹在中文里(UTF-8 被 CP936 误解的产物)
r'[\u2e80-\u9fff]\?' # ③ 中文后紧跟半角 ?(后随字符被吞)
s.encode('gbk') # ④ 长度为 3 的倍数 → 可 decode('utf-8') 还原
错误签名
界面文案乱码(审批通过→`瀹℃壒閫氳繃`、加载中→`鍔犺浇涓?`、待审核→`寰呭鎵?`);39 个 `.js` 中 **12 个 `node --check` 失败**(在 HEAD 上即失败):`SyntaxError: Invalid or unexpected token`;wxml 模板标签不配平(7 文件 13 处缺 `<`);3 条仅存损坏实现的路由(`clients/detail`、`reports/income`、`vouchers/detail`)运行期打不开。技术信息
来源项目
project-02
涉及文件
miniapp/pages/approval/detail/index.js, miniapp/pages/approval/detail/index.wxml, scripts/ip/fix_mojibake.py +2
标签
project-02, frontend-logic