Loading...
正在加载...
请稍候

NLua / KeraLua Unicode 编码经验

✨步子哥 (steper) 2026年03月29日 23:22
### 问题现象 在 `examples/mcp-meeting` 这类通过 MCP 驱动 Lua Agent 的流程里,PowerShell transcript 头部能正确保留中文议题,但 Lua Agent 返回正文时,中文可能退化成 `??` 或 `?????`。 这说明: 1. HTTP / MCP / PowerShell 外层通常是正常的。 2. 问题大概率发生在 `.NET string <-> NLua/KeraLua <-> Lua string` 的桥接层。 ### 根因 `NLua.Lua` 底层实际持有的是 `KeraLua.Lua` 状态对象。若未显式设置编码,字符串桥接在 Windows 下可能退回到不适合 Unicode 的默认编码路径,导致非 ASCII 文本被替换成 `?`。 受影响的不只是 Lua 脚本字面量,还包括: - C# 传给 Lua 的 `msg.content` - Lua 返回给 C# 的 `response.content` - 通过委托注册到 Lua 的平台 API 返回值 ### 正确修复 不要在 demo、脚本、Prompt 层把中文降级成 ASCII 来规避。应直接在运行时根部修复。 当前正确做法是在创建 `Lua` 实例后,立即设置: ```csharp _lua = new Lua(); _lua.State.Encoding = Encoding.UTF8; ``` 注意事项: 1. 这行要放在 `RegisterPlatformAPI()` 之前。 2. 这行要放在 `DoString()` / `LoadString()` / `LoadFile()` 之前。 3. 任何新建的独立 NLua 运行时,都要重复这一步,不能只依赖 `LuaRuntime` 已修过。 ### 验证方式 这类问题必须用真实中文做回归测试,不能只测 ASCII。 当前已覆盖的回归测试: - `tests/Runtime/RuntimeTests.cs` - `HandleMessageAsync_PreservesUnicodeContent` - `tests/Runtime/AgentHostServiceTests.cs` - `CreateStartAndRequestAgent_PreservesUnicodeContent` 推荐验证命令: ```bash dotnet test tests/GuaTeng.Tests.csproj -c Release --filter "FullyQualifiedName~RuntimeTests|FullyQualifiedName~AgentHostServiceTests" ``` ### 工程经验 1. 如果 transcript 头部中文正常、Lua 响应正文中文损坏,先查 NLua/KeraLua 编码,不要先怀疑 MCP JSON。 2. 这类问题应该修在 runtime 层,而不是让调用方自己做 ASCII fallback。 3. 修完后要把原先的 workaround 删掉,避免未来把 runtime 已修复的问题继续固化在案例层。

讨论回复

0 条回复

还没有人回复,快来发表你的看法吧!