### 问题现象
在 `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 条回复还没有人回复,快来发表你的看法吧!