Files
claude-code/spec/feature_20260510_F001_multi-encoding-file-tools/spec-plan-acceptance.md
claude-code-best 0ce8f7a1cb feat: 添加 GBK 编码自动检测支持,文件读写工具透明处理非 UTF-8 文件
新增 encoding.ts 核心模块实现三层编码检测(BOM → UTF-8 fatal → GBK 回退),
改造同步/异步读取路径和写入路径,使 FileReadTool/FileEditTool/FileWriteTool
能正确处理 GBK 编码文件。包含完整单元测试和 spec 文档。

Co-Authored-By: glm-5-turbo <zai-org@claude-code-best.win>
2026-05-10 20:50:12 +08:00

3.4 KiB
Raw Blame History

Acceptance Task: 多编码文件工具验收

前置条件:

  • 所有 Task 0-4 已执行完毕
  • 运行环境: 当前开发环境Bun

范围变更: 仅保留 GBK 编码支持Shift_JIS/EUC-JP/EUC-KR/Big5/GB18030/ISO-8859-1 已移除。

端到端验证:

  1. 运行完整测试套件确保无回归

    • bun run precheck
    • 预期: typecheck + lint fix + test 全部零错误通过
    • 失败排查: 检查各 Task 的测试步骤,特别是 Task 1 的编码检测测试和 Task 3 的 readFileInRange 测试
  2. 验证 GBK 文件读取正确性

    • 创建 GBK 编码测试文件:bun -e "const fs = require('fs'); const b = Buffer.from([0xC4, 0xE3, 0xBA, 0xC3, 0xCA, 0xC0, 0xBD, 0xE7, 0x0A]); fs.writeFileSync('/tmp/test-gbk.txt', b)"
    • 读取并验证:bun -e "import { readFileSyncWithMetadata } from './src/utils/fileRead.js'; const r = readFileSyncWithMetadata('/tmp/test-gbk.txt'); console.log('encoding:', r.encoding); console.log('content:', r.content)"
    • 预期: encoding 为 gbkcontent 为 "你好世界"
    • 失败排查: 检查 Task 1 的 detectEncoding 逻辑、Task 2 的 readFileSyncWithMetadata 集成
  3. 验证 UTF-8 文件读取回归

    • bun -e "import { readFileSyncWithMetadata } from './src/utils/fileRead.js'; const fs = require('fs'); fs.writeFileSync('/tmp/test-utf8.txt', 'Hello 世界\n'); const r = readFileSyncWithMetadata('/tmp/test-utf8.txt'); console.log('encoding:', r.encoding); console.log('content:', r.content)"
    • 预期: encoding 为 utf-8content 为 "Hello 世界"
    • 失败排查: 检查 Task 1 的 UTF-8 fatal 验证逻辑
  4. 验证 UTF-16LE 文件读取回归

    • bun -e "const fs = require('fs'); const b = Buffer.concat([Buffer.from([0xFF, 0xFE]), Buffer.from('Hello', 'utf16le')]); fs.writeFileSync('/tmp/test-utf16le.txt', b); import { readFileSyncWithMetadata } from './src/utils/fileRead.js'; const r = readFileSyncWithMetadata('/tmp/test-utf16le.txt'); console.log('encoding:', r.encoding); console.log('content:', r.content)"
    • 预期: encoding 为 utf-16lecontent 为 "Hello"
    • 失败排查: 检查 Task 1 的 BOM 检测层、Task 2 的集成
  5. 验证 readFileInRange 异步路径的 GBK 支持

    • bun -e "import { readFileInRange } from './src/utils/readFileInRange.js'; const r = await readFileInRange('/tmp/test-gbk.txt', 0); console.log('content:', r.content); console.log('totalLines:', r.totalLines)"
    • 预期: content 为 "你好世界"totalLines 为 1
    • 失败排查: 检查 Task 3 的 fast path 改造
  6. 验证 GBK 文件写入UTF-8 回退)

    • bun -e "import { writeTextContent } from './src/utils/file.js'; writeTextContent('/tmp/test-gbk-write.txt', '测试写入', 'gbk', 'LF'); const fs = require('fs'); const content = fs.readFileSync('/tmp/test-gbk-write.txt', 'utf8'); console.log('written:', content)"
    • 预期: 文件成功写入,内容为 "测试写入"UTF-8 回退或 GBK 编码均可接受)
    • 失败排查: 检查 Task 4 的 writeTextContent 改造和 encodeString 函数
  7. 验证编码检测性能

    • bun -e "import { detectEncoding } from './src/utils/encoding.js'; const buf = Buffer.alloc(4096, 0x41); const start = performance.now(); for (let i = 0; i < 1000; i++) detectEncoding(buf); console.log('avg:', (performance.now() - start) / 1000, 'ms')"
    • 预期: 平均检测耗时 < 1ms
    • 失败排查: 检查 Task 1 的检测逻辑是否有不必要的重复操作