Appearance
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.ts、fs-safe.ts等均传入"utf8"参数
因此,损坏不发生在文件 I/O 层,而可能发生在:
- LLM 层面:token 边界切割了多字节 UTF-8 序列
- 提示词层面:未明确要求 LLM 保留非 ASCII 字符原样输出
- 终端/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 对比(编辑前后),以精确定位损坏发生在哪一层。