Eval bug: llama-server tools using utf8 for a filename instead of cp866 for windows.

这个报错通常出现在 Windows 上通过 llama-server 内置文件工具(write_file / read_file 等)创建非 ASCII 文件名时,磁盘上的真实文件名出现乱码。优先排查 Windows 侧的 UTF-8 到文件系统路径(cp866/OEM 代码页)转换是否失效。

快速结论:这个报错通常出现在 Windows 上通过 llama-server 内置文件工具(write_file / read_file 等)创建非 ASCII 文件名时,磁盘上的真实文件名出现乱码。优先排查 Windows 侧的 UTF-8 到文件系统路径(cp866/OEM 代码页)转换是否失效。

适用环境:llama-server,Windows 10,version 9851 (0eca4d490),GGML backend CUDA,硬件 Ryzen 2700 + RTX 4090;模型为 Qwen3.5-27B-UD-Q4_K_M。Issue 中未提供 Python、PyTorch 版本信息,无需确认。

最快修复方案:暂无确认的一步修复方案。Issue 中提到的 Qwen 生成的补丁(fix_utf8_filepaths.patch、README_UTF8_FIX.md、INSTRUCTIONS.md)只是“partial solution”,并非官方验证方案;官方修复是后续的 #29415、#29475 等 Windows Unicode 路径清理提交。

注意事项:该 Issue 因 stale 自动关闭,但评论指出 bug 实际已在 2026 年 9 月底随 #29415 等修复落地。验证时不要只依赖 cmd.exe 的 dir 输出,控制台代码页会干扰观察,建议用 Python os.listdir() 做逐字符码点比对。

问题场景

在 Windows 10 上运行 llama-server,让模型调用内置文件工具(write_file / read_file)在服务器工作目录中创建带非 ASCII 名称的文件,例如让模型写入 Русский.md。工具返回值显示写入成功、路径正确,但在系统目录中看到的真实文件名变成乱码,例如 Р СѓСЃСЃРєРёР№.md。同样的现象也出现在创建非 ASCII 名称的文件夹时。用户尝试在 cmd.exe 中执行 chcp 65001 切换代码页,结果不变。

报错原文

Eval bug: llama-server tools using utf8 for a filename instead of cp866 for windows.

{"result":"file written successfully","path":"Русский.md","bytes":41}

dir output:
01.07.2026  18:35                41 Р СѓСЃСЃРєРёР№.md

The file name is not reencoded utf8->cp866.

原因分析

可能原因:llama-server 的文件工具在 Windows 上把来自模型工具调用的 UTF-8 路径字符串直接交给文件系统 API,而没有显式转换为 std::filesystem::path(即缺少 UTF-8 ↔ fs::path 的转换)。Windows 的窄字符文件 API 使用当前 OEM 代码页(俄语环境为 cp866),导致 UTF-8 字节被按 cp866 解释,磁盘上出现乱码文件名。工具本身返回的 JSON 仍显示原始 UTF-8 路径,所以“写入成功”的反馈与磁盘真实名称不一致。

环境排查

  • 确认 llama-server 版本:Issue 中为 version 9851 (0eca4d490),建议对比是否使用包含 #29415 及之后提交的构建。
  • 确认操作系统:Windows 10,以及当前控制台代码页(chcp),注意控制台代码页会影响你观察文件名的方式。
  • 确认 GGML backend:CUDA。
  • 确认触发工具:write_file、read_file 以及创建目录的内置工具(tools/server/server-tools.cpp)。
  • 用 Python os.listdir() 而非 cmd.exe dir 检查真实文件名,并做逐字符码点比对,排除控制台编码干扰。

解决步骤

  1. 先按原复现路径触发一次:让模型用 write_file 在服务器工作目录写入非 ASCII 文件名,例如 файл_проверки.txt。
  2. 不要用 cmd.exe 的 dir 判断,改用 Python 在工作目录执行 os.listdir(),打印列表中每个名称的逐字符码点(如 [hex(ord(c)) for c in name]),确认是否与传给工具的路径完全一致。
  3. 若码点不一致:属于 #29415 之前的旧行为。升级到包含 #29415(common: extract shared unicode path/string helpers,通过 std::filesystem::u8path 做显式 UTF-8 ↔ fs::path 转换)及 #29475 等后续提交的 llama.cpp 构建。这些是 Issue 评论中确认的实际修复来源。
  4. 若无法立即升级,可参考评论中 Qwen 提出的补丁 fix_utf8_filepaths.patch 及其配套 README_UTF8_FIX.md / INSTRUCTIONS.md,但需视为“可优先尝试”,因为原文只称其为 partial solution,未经官方验证。
  5. 升级后重复第 1、2 步,并用 read_file 以相同路径读回内容,验证写入 → listdir → 读取的往返是否稳定。

验证方法

在 Windows 10 的 cp866 控制台代码页下(保持原始复现条件),用 write_file 创建西里尔字母文件名,随后用 Python os.listdir() 获取真实文件名并逐字符比对码点,确认与传给工具的路径完全一致、无 cp866 乱码;再用 read_file 以同一路径读取,确认 UTF-8 内容完整返回,没有乱码或内容损坏。

参考来源

ggml-org/llama.cpp #25200

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 27358

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注