Skip to content

docs: 修复中文文档 GBK 双重编码乱码 + 清理失效文档引用(C3) - #5

Merged
FPSZ merged 7 commits into
FPSZ:collabfrom
wjs480:fix/zh-doc-encoding
Sep 16, 2026
Merged

FPSZ merged 7 commits into
FPSZ:collabfrom
wjs480:fix/zh-doc-encoding

Conversation

@wjs480

@wjs480 wjs480 commented Sep 14, 2026

Copy link
Copy Markdown

背景

核对文档时发现仓库里有 3 个中文文档是乱码(UTF-8 字节被当作 GBK 解码后又存成 UTF-8 的「双重编码」):

  • docs/guides/enterprise.zh-CN.md
  • docs/guides/TUTORIAL.zh-CN.md
  • docs/release/RELEASE_NOTES_v0.2.0.md

已确认 HEAD 与本地一致、且本地对这些文件无改动 → 是仓库本身的问题,不是本地环境造成。这正对应 plan.md 里的待复核项 C3「Windows GBK→UTF-8 乱码复核」。全库扫描(md / rs / ts / tsx / json / yaml / toml / ps1 / html)确认只有这 3 个文件受影响,代码、字符串字面量与配置均未被破坏。

改了什么(11 个文件 / 7 个提交 / +217 −218)

一、乱码修复(核心)

  1. 往返还原当前文本 → 按 GBK 还原字节 → 按 UTF-8 解码,保持 UTF-8 无 BOMCRLF,不引入换行噪声。

  2. 按字节证据补回空洞:双重编码过程把一部分字节写成了 ?。这些空洞丢的是当时 GBK 解不出来的那 1–2 个字节,但空洞前面仍残留同一字符的 UTF-8 前缀——把前缀补 0x80–0xBF 枚举出候选字符,再结合上下文与英文主文档确定原文。

    例如 应用不会自动启动本地 llama.cpp 或远<?>runtime 这一处,候选集里只有「端」没有「程」,所以原文是远端最终 runtime candidate每行一个 JSON 事件向量检索SQLite 持久化UI 语言与 AI 回答语言分离 等同理。

  3. 结构还原:把因换行被吃掉而挤在一行的 5 个 bullet 拆回独立列表项;三个文件最长行分别是 147 / 128 / 86 字符。

二、渲染修复

用 CommonMark 解析器检查出 4 处渲染问题并修好:两处正文中间夹着一级标题、两处段落被渲染成同一段、企业文档末尾缺换行符。修完后渲染问题数为 0。

三、失效文档引用清理(顺带)

  • enterprise.md / enterprise.zh-CN.md../deploy/README.md 少退一层 → ../../deploy/README.md
  • README.md / README.en.md:教程链接缺 guides/ 一层
  • docs/README.md:去掉指向已被删除的 PLAN_CHANGELOG.md 的索引项
  • CONTRIBUTING.md / CONTRIBUTING.en.md / STRUCTURE.md / plan.md:清理对已删除文档(AI.md = 4bd8556 删除、UI.md = fc455ca 删除、PLAN_CHANGELOG.md = a94bb41 删除)与已改名文档(README.zh-CN.mdCONTRIBUTING.zh-CN.md)的过期引用

验证

  • 三份文档 U+FFFD 归零;唯一保留的字面 ?GET /api/admin/audit?page=1&page_size=50 里的 query string
  • 192 处空洞逐一比对:190 处填入字符落在字节前缀允许的候选集内;另 2 处为上述 URL 真问号与私用区字符所在行(该行改用行级字节算术核对:乱码侧 26 字节 + 1 个空洞 = 当前 27 字节,吻合)
  • CommonMark 渲染检查:三份文档问题数 0
  • 全仓库相对链接普查:0 失效(47 条相对链接全部可解析)
  • 行尾统一 CRLF、无 BOM、无混行;git diff --check 干净

本描述于 PR 合并后按评审建议更新:标题与描述同步到实际改动范围(11 个文件),并修正原描述里已过时的「已知残留:约 71 行行尾带 ?」——这些空洞已全部按字节证据补回。

enterprise.zh-CN.md、TUTORIAL.zh-CN.md、RELEASE_NOTES_v0.2.0.md 在仓库中即为乱码(UTF-8 字节被当 GBK 解码后又存为 UTF-8);确认 HEAD 与本地一致,非本地环境问题,对应 plan 里的 C3 待复核项。

修复方式为往返还原(当前文本 → GBK 字节 → UTF-8 解码),保持 UTF-8 无 BOM 与 CRLF 不变。已知残留:原损坏过程把部分全角标点等替换成 '?',属不可逆损失。
@sourcery-ai

sourcery-ai Bot commented Sep 14, 2026

Copy link
Copy Markdown

审查者指南

本 PR 仅修复 3 个中文 Markdown 文档因 GBK→UTF-8 双重编码造成的乱码,通过字节级往返还原恢复可读文本,并验证乱码特征归零且保持原有 BOM 与换行格式;部分损坏过程中已不可逆丢失的字符仍以问号保留。

文件级变更

变更 详细信息 文件
还原三个中文 Markdown 文档的双重编码内容,并保持原文件格式特征。
  • 将 GBK 双重编码文本逐行还原为可读中文。
  • 保留 UTF-8 无 BOM、CRLF 换行及逐行等价替换。
  • 移除三份文档中的乱码特征;部分原始不可逆字符仍以问号残留。
docs/guides/enterprise.zh-CN.md
docs/guides/TUTORIAL.zh-CN.md
docs/release/RELEASE_NOTES_v0.2.0.md
修复企业指南、中文教程和 v0.2.0 发布说明中的中文文档可读性。
  • 恢复标题、段落、列表、接口说明和代码示例等中文内容。
  • 不修改代码、配置或文档所描述的产品行为。
docs/guides/enterprise.zh-CN.md
docs/guides/TUTORIAL.zh-CN.md
docs/release/RELEASE_NOTES_v0.2.0.md

提示和命令

与 Sourcery 交互

  • 触发新的审查: 在拉取请求中评论 @sourcery-ai review
  • 继续讨论: 直接回复 Sourcery 的审查评论。
  • 根据审查评论生成 GitHub issue: 回复审查评论,请 Sourcery 根据该评论创建 issue。也可以在审查评论中回复 @sourcery-ai issue,根据该评论创建 issue。
  • 生成拉取请求标题: 在拉取请求标题的任意位置写入 @sourcery-ai,即可随时生成标题。也可以在拉取请求中评论 @sourcery-ai title,以随时生成或重新生成标题。
  • 生成拉取请求摘要: 在拉取请求正文中任意位置写入 @sourcery-ai summary,即可在指定位置随时生成 PR 摘要。也可以在拉取请求中评论 @sourcery-ai summary,以随时生成或重新生成摘要。
  • 生成审查者指南: 在拉取请求中评论 @sourcery-ai guide,即可随时生成或重新生成审查者指南。
  • 解决所有 Sourcery 评论: 在拉取请求中评论 @sourcery-ai resolve,即可解决所有 Sourcery 评论。如果你已经处理完所有评论且不想再看到它们,这一功能会很有用。
  • 忽略所有 Sourcery 审查: 在拉取请求中评论 @sourcery-ai dismiss,即可忽略所有现有的 Sourcery 审查。如果你想从头开始新的审查,这一功能尤其有用——别忘了评论 @sourcery-ai review 以触发新的审查!

自定义使用体验

访问你的控制面板以:

  • 启用或禁用审查功能,例如 Sourcery 生成的拉取请求摘要、审查者指南等。
  • 更改审查语言。
  • 添加、移除或编辑自定义审查说明。
  • 调整其他审查设置。

获取帮助

Original review guide in English

Reviewer's Guide

本 PR 仅修复 3 个中文 Markdown 文档因 GBK→UTF-8 双重编码造成的乱码,通过字节级往返还原恢复可读文本,并验证乱码特征归零且保持原有 BOM 与换行格式;部分损坏过程中已不可逆丢失的字符仍以问号保留。

File-Level Changes

Change Details Files
还原三个中文 Markdown 文档的双重编码内容,并保持原文件格式特征。
  • 将 GBK 双重编码文本逐行还原为可读中文。
  • 保留 UTF-8 无 BOM、CRLF 换行及逐行等价替换。
  • 移除三份文档中的乱码特征;部分原始不可逆字符仍以问号残留。
docs/guides/enterprise.zh-CN.md
docs/guides/TUTORIAL.zh-CN.md
docs/release/RELEASE_NOTES_v0.2.0.md
修复企业指南、中文教程和 v0.2.0 发布说明中的中文文档可读性。
  • 恢复标题、段落、列表、接口说明和代码示例等中文内容。
  • 不修改代码、配置或文档所描述的产品行为。
docs/guides/enterprise.zh-CN.md
docs/guides/TUTORIAL.zh-CN.md
docs/release/RELEASE_NOTES_v0.2.0.md

Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

@sourcery-ai sourcery-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

你好——我发现了 2 个问题

AI 代理提示
请处理本次代码审查中的评论:

## 单独评论

### 评论 1
<location path="docs/guides/TUTORIAL.zh-CN.md" line_range="5" />
<code_context>
+英文主教程(推荐优先阅读):[TUTORIAL.md](./TUTORIAL.md)

-> 璇存槑锛氭湰椤垫槸涓枃杈呭姪鐗堬紝缁撴瀯涓庤嫳鏂囦富鏁欑▼瀵归綈锛屼絾鍐呭鏇寸簿绠€銆?
+> 说明:本页是中文辅助版,结构与英文主教程对齐,但内容更精简�?

-## 1. 鍑嗗鏉′欢
</code_context>
<issue_to_address>
**细节问题:** 修复后的文档仍然包含字面量 Unicode 替换字符(``)和截断文本,因此所声称的可读中文修复并不完整。诸如 `中文辅助版,结构与英文主教程对齐,但内容更精简�?``企业版预览(单租户私有化�?` 这样的标题和句子,对读者来说仍然明显损坏。

**触发场景:** 用户阅读修复后的中文文档时。

**建议修复:** 将每个 ``/截断片段替换为预期的中文标点或措辞;或者明确报告这些剩余的替换字符属于尚未解决的损坏,而不是声称已经完成完整修复。
</issue_to_address>

### 评论 2
<location path="docs/guides/TUTORIAL.zh-CN.md" line_range="15" />
<code_context>
+  - 远程:OpenAI-compatible endpoint + API key�?

-## 2. 棣栨閰嶇疆锛堟闈㈢増锛?
+## 2. 首次配置(桌面版�?

-1. 鎵撳紑璁剧疆锛堝彸涓婅榻胯疆锛夈€?
</code_context>
<issue_to_address>
**细节问题:** 新近恢复的几个标题仍然格式错误,并不是有效的中文标题:`首次配置(桌面版�?``## 运行时收口模�?``## 私有化部署资�?``# Memory OS Lite 企业价�?``### 性能与索�?` 的末尾都包含替换/截断痕迹。尽管周围的正文已经完成转换,但这使文档结构和术语仍不完整。

**触发场景:** 读者按章节标题浏览或搜索中文 Markdown 文档时。

**建议修复:** 恢复各标题中缺失的标点和字符,例如补上右括号,以及 `模型``资产``价值``索引` 中缺失的文字。
</issue_to_address>

Sourcery 评估

已批准。


Sourcery 对开源项目免费——如果您喜欢我们的评审,请考虑分享它们 ✨
Original comment in English

Hey - I've found 2 issues

Prompt for AI Agents
Please address the comments from this code review:

## Individual Comments

### Comment 1
<location path="docs/guides/TUTORIAL.zh-CN.md" line_range="5" />
<code_context>
+英文主教程(推荐优先阅读):[TUTORIAL.md](./TUTORIAL.md)

-> 璇存槑锛氭湰椤垫槸涓枃杈呭姪鐗堬紝缁撴瀯涓庤嫳鏂囦富鏁欑▼瀵归綈锛屼絾鍐呭鏇寸簿绠€銆?
+> 说明:本页是中文辅助版,结构与英文主教程对齐,但内容更精简�?

-## 1. 鍑嗗鏉′欢
</code_context>
<issue_to_address>
**nitpick:** The repaired documents still contain literal Unicode replacement characters (``) and truncated text, so the claimed readable Chinese restoration is incomplete. Headings and sentences such as `中文辅助版,结构与英文主教程对齐,但内容更精简�?` and `企业版预览(单租户私有化�?` remain visibly corrupted to readers.

**Triggers:** When a user reads the repaired Chinese documentation.

**Suggested fix:** Replace each ``/truncated fragment with the intended Chinese punctuation or wording, or explicitly report these remaining replacement characters as unresolved corruption rather than claiming a complete repair.
</issue_to_address>

### Comment 2
<location path="docs/guides/TUTORIAL.zh-CN.md" line_range="15" />
<code_context>
+  - 远程:OpenAI-compatible endpoint + API key�?

-## 2. 棣栨閰嶇疆锛堟闈㈢増锛?
+## 2. 首次配置(桌面版�?

-1. 鎵撳紑璁剧疆锛堝彸涓婅榻胯疆锛夈€?
</code_context>
<issue_to_address>
**nitpick:** Several newly restored headings are still malformed rather than valid Chinese headings: `首次配置(桌面版�?`, `## 运行时收口模�?`, `## 私有化部署资�?`, `# Memory OS Lite 企业价�?`, and `### 性能与索�?` end with replacement/truncation artifacts. This makes the document structure and terminology incomplete even though the surrounding prose was converted.

**Triggers:** When readers navigate or search the Chinese Markdown documents by section heading.

**Suggested fix:** Restore the missing punctuation and characters in each heading, such as the closing parenthesis and the missing words in `模型`, `资产`, `价值`, and `索引`.
</issue_to_address>

Sourcery assessment

Approved.


Sourcery is free for open source - if you like our reviews please consider sharing them ✨

Comment thread docs/guides/TUTORIAL.zh-CN.md Outdated
Comment thread docs/guides/TUTORIAL.zh-CN.md Outdated
@FPSZ

FPSZ commented Sep 15, 2026

Copy link
Copy Markdown
Owner

方向是对的,恢复质量也不错(涓枃中文鐗堟湰浜偣版本亮点棣栦釜鍙敤鐨勫叕寮€妗岄潰鐗堟湰首个可用的公开桌面版本,正文基本全回来了)。但还没做完,合并前请再走一轮。

先说清楚性质:不是这个 PR 弄坏的

我核过三个文件修复前后的情况:

文件 修复前 修复后
docs/guides/TUTORIAL.zh-CN.md U+FFFD = 0 U+FFFD = 67
docs/guides/enterprise.zh-CN.md U+FFFD = 0 U+FFFD = 100
docs/release/RELEASE_NOTES_v0.2.0.md U+FFFD = 0 U+FFFD = 24

乍看像是修复引入了 191 个乱码,其实不是:原始损坏本身就是不可逆的。这些文件是 UTF-8 被当 GBK 读,(U+3002 = E3 80 82)里 E3 80 被解成 ,第三个字节 82 当场就丢了。所以修复前虽然 FFFD=0,但那是"格式合法的错字",信息早已缺失。现在反向恢复只能拿回前两个字节,于是变成 �?

换句话说:从"完全不可读"变成"基本可读 + 191 个洞",净收益很大。但这 191 个洞得补上才能合。

需要处理的两件事

1. 191 处 �? 需要按上下文补回

全是同一种形态(U+FFFD 紧跟一个字面 ?),直接搜 �? 就能全部定位:

  • 138 处在行尾 —— 绝大多数原本是 ,可以批量处理后抽查
  • 53 处在行中 —— 丢的是实义字,必须逐个按上下文判断,不能批量替换

行中的例子(都能从上下文推出来):

向量检�?                          → 向量检索
SQLite 持久�?                     → SQLite 持久化
UI 语言�?AI 回答语言分离           → UI 语言与 AI 回答语言分离
- 连接失败:检�?endpoint 路径�?key,切�?provider 后重新测试
                                  → 检查 endpoint 路径与 key,切换 provider
- 统计一�?0                       → 统计一直 0
- 每行一�?JSON 事件               → 每行一条 JSON 事件
- server �?desktop 在使用模型设置前 → server 与 desktop
- 审计中不得泄�?API key 明文       → 不得泄露 API key

2. 顺带请一起修:列表项被并行了

docs/guides/enterprise.zh-CN.md 有几行把多个 bullet 挤到了一行,markdown 渲染会整个塌掉。最严重的是 L200,5 个列表项连成一行:

- SQLite 继续作为默认存储内核…默认留在本地�?- Evidence Firewall 把文�?citation…证据链�?- MCP full-control…可撤销路径�?- `answer_source_mix`…失败原因�?- 模型 egress policy…远�?provider�?

L17 也有同样问题(2 项并行)。

成因和上面是同一个:原文 。\n = E3 80 82 0A,GBK 解码时 82 0A 这个非法组合把换行符一起吃掉了。这属于原文件就有的损坏(不是这个 PR 造成的),但既然这轮就是来修这三个文件的编码问题,建议一并处理掉,不然渲染出来的文档还是坏的。

�? 的时候按 �?- 这个模式找一下就能定位到全部并行点。


修完之后建议用渲染视图(GitHub 预览或本地 markdown preview)通读一遍这三份文档——这类问题肉眼过源码容易漏,看渲染结果最快。

辛苦了,这三份文档坏了很久,能捞回来很有价值。

评审 FPSZ#5:U+FFFD 紧跟字面 ? 的空洞共 191 处。本提交按评审建议批量处理行尾空洞(绝大多数原本是全角句号),并把因换行被吃掉的并行列表项拆回独立行(?- 模式)。行中空洞(丢的是实义字)需逐句判断,留待下一批。
三个中文文档在仓库里是“UTF-8 字节被按 GBK 二次解码”写坏的,恢复后还剩
行中空洞;上一批批量补句号时也有一批位置补错了。这一批全部按字节证据逐处修正。

方法:空洞处丢的是当时 GBK 解不出来的那 1~2 个字节,而空洞前面仍残留同一字符的
UTF-8 前缀。把前缀补 0x80~0xBF 枚举出候选字符,再结合上下文与英文主文档定原文。

- 补齐剩余行中空洞:如“远端 runtime”“展示”“同一套”“最终”“每行一个”等
- 纠正误补成句号的位置 45 处:标题(发版前检查/可选烟测脚本/认证与会话/运行时收口模型/
  私有化部署资产/性能与索引/企业价值)、未闭合括号 14 处、列表引导语改冒号 31 处
- 修正上一批猜字与字节证据不符的 11 处(远程→远端、与→和/或、为→是、在→为 等)
- 去掉拆行时多出的一个空格 5 处

验证:三份文档 U+FFFD 归零;全部 191 处空洞的填入字符都落在字节前缀允许的候选集内
(190 处逐一比对通过,2 处为 URL 里的真问号与已正确处);行尾保持 CRLF、无 BOM。
用 CommonMark 渲染器(markdown-it-py)检查三份中文文档,发现 4 处渲染问题。
这些都是原文档自带的排版问题(乱码不会改变 # 和空行),按要求一并修好:

- 教程末尾 “Memory OS Lite 使用提示” 由一级标题降为二级,并补空行
- 企业文档末尾 “Memory OS Lite 企业价值” 同样降为二级,前后补空行
- 企业文档末尾说明段与“企业侧应重点强调:”之间补空行,不再被渲染成同一段
- 企业文档末尾补上换行符(其余行本就是 CRLF,末尾不再是裸 LF)

验证:渲染结构检查三份文档问题数 0;行尾全 CRLF 无混合;U+FFFD 仍为 0;
空洞字节审计结果不变(190 处通过 / 0 处不符 / 2 处已解释)。
docs/guides/ 下的相对路径要多退一层:../deploy/README.md 会解析到不存在的
docs/deploy/README.md,而 deploy 目录在仓库根。中英两份指南同一处都写错了,
一起修正为 ../../deploy/README.md。

验证:按 GitHub 的相对路径语义解析,两处都能指到仓库根的 deploy/README.md;
三份中文文档的链接检查、渲染检查、字节证据审计仍全部通过。
全仓库相对链接普查发现 5 处失效,本提交修掉 README/索引这 3 处(另 2 处
deploy 链接已在上一提交修正):

- README.md / README.en.md:教程链接少了 guides/ 一层,改指 docs/guides/
- docs/README.md:删掉指向 docs/planning/PLAN_CHANGELOG.md 的索引项,因为该文件
  在上游 a94bb41 已被删除,main/dev/collab 等所有分支上都不存在

验证:全仓库相对链接普查 0 处失效(47 条相对链接全部可解析)。
上游删掉或改名的文档,仓库里还留着"让读者去读 / 去更新"的索引,逐处清理:

- docs/planning/plan.md:Change Log 一节原写"变更日志已迁移至
  docs/planning/PLAN_CHANGELOG.md",该文件在上游 a94bb41 已删除(main/dev/collab
  都没有),改成说明不再单独维护、历史变更查 git 提交记录
- CONTRIBUTING.md / CONTRIBUTING.en.md:
  * README.zh-CN.md → README.en.md、CONTRIBUTING.zh-CN.md → CONTRIBUTING.en.md
  * 去掉指向已删除的 AI.md(4bd8556 删除)与 UI.md(fc455ca 删除)的条目
- docs/architecture/STRUCTURE.md:文档分工与建议阅读顺序里去掉已删除的 docs/AI.md
  (并重排编号),plan.md 的描述同步去掉"变更日志"

验证:全仓库相对链接普查 0 失效;三份中文文档五层审计 0 问题;改动文件行尾统一
CRLF、末尾有换行、无 U+FFFD(plan.md 的 BOM 是上游既有,未改动)。
wjs480 pushed a commit to wjs480/Memori-Vault that referenced this pull request Sep 15, 2026
评审 FPSZ#5:U+FFFD 紧跟字面 ? 的空洞共 191 处。本提交按评审建议批量处理行尾空洞(绝大多数原本是全角句号),并把因换行被吃掉的并行列表项拆回独立行(?- 模式)。行中空洞(丢的是实义字)需逐句判断,留待下一批。
@wjs480

wjs480 commented Sep 15, 2026

Copy link
Copy Markdown
Author

按提交分层说明一下,方便评审按需取舍。

一、乱码修复(ec18772 / 20733b3 / 2ce9b6c

这三份中文文档是「UTF-8 字节被按 GBK 二次解码」写坏的。恢复过程有字节级依据,不是猜:空洞处丢的是当时 GBK 解不出来的那 1–2 个字节,但空洞前面仍残留同一字符的 UTF-8 前缀;把前缀补 0x80–0xBF 就能枚举出候选字符,再结合上下文与英文主文档确定原文。

  • ec18772:往返还原三份文档(UTF-8 无 BOM,保持 CRLF)
  • 20733b3:补回 138 处行尾空洞(绝大多数原本就是全角句号),并把被换行吃掉的列表项拆回独立行
  • 2ce9b6c:补完剩余行中空洞,并纠正上一批误补的标点

举个能说明「为什么不是猜」的例子:应用不会自动启动本地 llama.cpp 或远<?>runtime 这一处,按前缀枚举出的候选集里只有「端」、没有「程」,所以原文是远端而不是「远程」。

验证:三份文档 U+FFFD 归零;192 处空洞逐一比对,190 处填入字符落在字节前缀允许的候选集内;剩下 2 处分别是 URL 里的真问号(audit?page=...)与私用区字符所在行(该行改用行级字节算术核对:乱码侧 26 字节 + 1 个空洞 = 当前 27 字节,吻合)。

二、渲染修复(67e8f27)

用 CommonMark 解析器检查,发现 4 处渲染问题:两处正文中间夹着一级标题、两段被渲染成同一段、企业文档末尾缺换行符。修完后渲染问题数为 0。

三、文档卫生(265f99b / a5c3d77 / 887c664,可按需拆分)

  • 265f99benterprise.md / enterprise.zh-CN.md 里的 ../deploy/README.md 少退一层,改为 ../../deploy/README.md
  • a5c3d77README.md / README.en.md 的教程链接缺 guides/ 一层;docs/README.md 去掉指向已被删除的 PLAN_CHANGELOG.md 的索引项
  • 887c664:清理过期引用——AI.md(4bd8556 删除)、UI.md(fc455ca 删除)、PLAN_CHANGELOG.md(a94bb41 删除)在 CONTRIBUTING / STRUCTURE 里的残留条目

如果希望本 PR 只聚焦中文文档修复,前 4 个提交(ec18772 / 20733b3 / 2ce9b6c / 67e8f27)已完整可用,第 5–7 个我可以另开一个 PR,说一声即可。

总验证:三份中文文档的「编码 / 结构 / 链接 / 渲染 / 字节证据」五层检查 0 问题;全仓库相对链接普查 0 失效。

@FPSZ

FPSZ commented Sep 16, 2026

Copy link
Copy Markdown
Owner

复审通过,可以合了。上一轮提的两件事都做完了,而且做得比要求的更彻底。

核实结果

1. 191 处空洞已清零

文件 上一轮 现在
TUTORIAL.zh-CN.md U+FFFD = 67 0
enterprise.zh-CN.md U+FFFD = 100 0
RELEASE_NOTES_v0.2.0.md U+FFFD = 24 0

残留的唯一一个字面 ?GET /api/admin/audit?page=1&page_size=50 里的 query string,是正常内容。

补字抽查下来都对,而且读着自然:

向量检索 ✓        SQLite 持久化 ✓      UI 语言与 AI 回答语言分离 ✓
检查 endpoint 路径和 key ✓             统计一直 0 ✓
server 与 desktop ✓                    每行一个 JSON 事件 ✓
审计中不得泄露 API key 明文 ✓          完成后在 SYNTHESIS 标题显示总耗时 ✓

(有几处原字节已不可考,// 这类选哪个都不影响语义,不用纠结。)

2. 列表并行已拆开

之前 enterprise.zh-CN.md 那处 5 个 bullet 挤成一行的,现在是 L205–209 五行独立列表项,渲染正常。三个文件的最长行分别是 147 / 128 / 86 字符,没有残留的并行点。

3. 顺带做的链接修复

我把这个 PR 改到的全部 md 文件做了一遍本地链接检查:38 条本地链接,失效 0 条../../deploy/README.md../architecture/MEMORY_OS_LITE.md./docs/guides/TUTORIAL.zh-CN.md 这些新改的都能正确解析。


一个小建议(不影响合并)

PR 标题还是「修复 3 个中文文档的 GBK 双重编码乱码(C3)」,但现在实际改了 11 个文件,多出来的是 CONTRIBUTING.md / README.md / STRUCTURE.md / plan.md 的链接与文档引用清理。

这些改动本身没问题(我都验过),只是建议把标题和描述更新一下,比如「修复中文文档 GBK 双重编码乱码 + 清理失效文档引用(C3)」,免得以后翻 git log 的人按标题找不到链接修复那部分。


这三份文档坏了很久,能按字节证据一点点捞回来、连列表结构都还原了,这活干得漂亮。

@FPSZ
FPSZ merged commit a1a1f5e into FPSZ:collab Sep 16, 2026
1 check passed
FPSZ added a commit to wjs480/Memori-Vault that referenced this pull request Sep 16, 2026
合并 FPSZ#2/FPSZ#3/FPSZ#5 后的 collab,三处冲突均为双方各自新增内容,保留双方:
- README.md「已实现但仍在优化」:50k 压测条目 + OCR 条目
- docs/qa/RETRIEVAL_BASELINE_V2.md:作答层 LLM-judge 基线 + OCR 接入与边界
- memori-server/src/dto.rs:AppSettings 的 index_filter 与 ocr_tesseract_path 两个字段

同时启用 pdf_with_indirect_resources_is_extracted(原 #[ignore]):
手工构造 lopdf::Stream 用结构体字面量会绕过 /Length 写入(lopdf object.rs:602
的 Stream::new 才会 dict.set("Length", ...)),存盘后流长度为 0、load 回来
content 为空,解码拿不到像素,测试因此假失败——与 get_pages() 无关(实测
get_pages()=1、get_page_resources 也正确返回 inherited)。改用 Stream::new 后
测试通过,可作为间接 /Resources + 间接 /XObject 的回归锁。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@wjs480 wjs480 changed the title docs: 修复 3 个中文文档的 GBK 双重编码乱码(C3) docs: 修复中文文档 GBK 双重编码乱码 + 清理失效文档引用(C3) Sep 16, 2026
@wjs480

wjs480 commented Sep 16, 2026

Copy link
Copy Markdown
Author

@FPSZ 已按建议更新:

  • 标题docs: 修复中文文档 GBK 双重编码乱码 + 清理失效文档引用(C3)
  • 描述:按「乱码修复 / 渲染修复 / 失效文档引用清理」三层重写,说明 11 个文件的构成与 +217 −218 的规模,并修正原先那段已过时的「已知残留:约 71 行行尾带 ?」——那些空洞已全部按字节证据补回

合并提交与 diff 未受影响(a1a1f5e,11 个文件 +217/−218)。谢谢复核。

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