Skip to content

edit 工具损坏丹麦字符(æ、ø、å):UTF-8 编码问题排查

问题

使用 edit 工具编辑含丹麦字符(æ、ø、å)的文件时,字符被损坏(Mojibake)。用户认为是 Windows-1252 编码问题,但社区分析指出实际情况更复杂。

社区分析(@Sanjays2402)

OpenClaw 的文件 I/O 层已明确使用 UTF-8:

  • 读取:buffer.toString("utf-8") — 与操作系统区域设置无关
  • 写入:fs.writeFile(path, content, "utf-8") — 强制 UTF-8 写入
  • pi-tools.read.tsfs-safe.ts 等均传入 "utf8" 参数

因此,损坏不发生在文件 I/O 层,而可能发生在:

  1. LLM 层面:token 边界切割了多字节 UTF-8 序列
  2. 提示词层面:未明确要求 LLM 保留非 ASCII 字符原样输出
  3. 终端/Shell 层面(Windows):中间工具链的编码转换

解决方案

方案一:在 system prompt 中明确要求保留特殊字符

在 agent 配置中添加指令:

json5
{
  agents: {
    defaults: {
      systemPromptSuffix: "当编辑文件时,必须保留所有非 ASCII 字符(包括 æ、ø、å 等)完全不变,不得转换或近似替换。",
    },
  },
}

方案二:编辑后验证文件编码

bash
# 验证文件是否仍为有效 UTF-8
file -i HB_LOG.md
# 或
python -c "open('HB_LOG.md', encoding='utf-8').read(); print('OK')"

方案三:Windows 环境设置系统级 UTF-8

在 Windows 11 中:控制面板 → 区域设置 → 管理 → 更改系统区域设置 → 勾选"Beta:使用 Unicode UTF-8 提供全球语言支持"。

这将把系统默认编码(process.env.CHCP)从 CP936/CP1252 改为 UTF-8,可能解决中间层的编码转换问题。

备注:如果问题仍存在,建议在 GitHub issue #69636 中提供 hexdump 对比(编辑前后),以精确定位损坏发生在哪一层。