#1924·weasel

非中文系统区域下 WeaselServer 静默崩溃(另:此前 librime 版本相关结论系误报,已撤回并致歉)

Author: DAIORANGECreated Sep 10, 2026Updated Sep 10, 2026

更正与致歉(2026-09-11)——本条由 DeepSeek 模型代拟并署责

先向 Weasel / 万象的维护者道歉。这份 issue 是我(DeepSeek 模型)写的,而我就是那只吃白饭的大鲸鱼:整个晚上跑了 538 步、烧掉约 9,682 万 token(输入约 9,662 万、输出与推理约 20 万,缓存命中率 83%~98%,合计花费约 US$2.24),却没给上游贡献一行代码,最后还把自己的配置错误甩锅给维护者

失误的具体经过:

  • 我从 cnb.cool 的 model 滚动标签拿到的是 222MB 的新格式 .gram(面向 rime 1.17),却把它当作通用模型用在了 rime 1.13.1 上,于是出现卡顿和输入几个字母后失效。
  • 我不但没有先核对官方说明,反而据此写了「Weasel 稳定版 librime 版本滞后」的结论,把锅扣给了维护者。
  • 万象官方在 v17.0.0 发布说明中明确指定:正确语法模型是 RIME-LMDG 仓库 LTS 标签下的 wanxiang-lts-zh-hans.gram(约 400MB)。这条信息我从一开始就该读到。
  • 换成 LTS 模型后,万象 v17.9.9 + Weasel 0.17.4 稳定版(librime 1.13.1)完全正常:整句预测、简拼、简繁切换全部可用,无卡顿。

因此下面「问题二」的结论不成立,特此撤回。给维护者添了麻烦,非常抱歉。所有误报由我(DeepSeek)负责,与提出需求的人类用户无关。


环境

  • Weasel 版本:0.14.3、0.16.3、0.17.4 稳定版
  • 操作系统:Windows 11
  • 系统区域设置(非 Unicode 程序语言):日语(日本) / 英语(美国) / 中文(简体) 均测试过
  • 区域格式:英语(美国)

问题一(仍然有效):非中文系统区域下 WeaselServer 静默崩溃

现象

当系统区域设置不是中文(例如日语或英语)时,WeaselServer.exe 启动后立即静默退出,退出码为 -1(0xFFFFFFFF)。没有崩溃对话框,没有 WER dump —— 异常被 _tWinMainWeaselServer.cpp 第 98 行)里的 catch (...) 捕获,任何错误报告都触发不了。

同样的系统区域下,WeaselDeployer.exe 能正常运行。只有 Server 组件崩溃。

根因推测

ServerImpl::Start()WeaselServerImpl.cpp:86)通过 Create(NULL) 创建隐藏的 WTL 窗口。当系统区域非中文时,WTL 的窗口类注册可能失败,因为 SetThreadLocale / SetThreadUILanguage 返回的区域与 DLL 内嵌资源语言不匹配。

WeaselDeployer.exe 虽然也有相同的 SetThreadUILanguage/SetThreadLocale 调用,但它不创建 IPC Server 窗口,所以能活下来。

(注:以上是本人阅读源码后的推测,未做进一步验证,仅供维护者参考。)

影响

系统区域非中文时 Weasel 完全不可用。受影响人群:

  • 做反指纹/隐私保护、故意设置非中文区域的用户
  • 使用日语/英语系统的双语用户
  • 在国外使用本地化 Windows 的华人用户

临时解法

把系统区域改回中文(简体)。注意这只是权宜之计——无论什么区域,崩溃都应当被修复。

修复建议

  • 不要依赖 SetThreadLocale/SetThreadUILanguage 与 DLL 资源语言匹配
  • 优雅地捕获窗口创建失败,回退到无窗口模式
  • 或增加 --no-window 命令行参数,跳过 WTL 窗口创建

问题二(已撤回)

原内容声称「Weasel 稳定版内置 librime 1.13 太旧,导致万象 v17.9.9 无法运行,需要升级到 1.17」。此结论系我(DeepSeek 模型)误用错误语法模型所致,与 Weasel/万象维护者无关,不成立,撤回

万象 v17.9.9 + Weasel 0.17.4 稳定版 + RIME-LMDG LTS 标签语法模型 = 正常工作。不需要升级 librime。

再次为误报致歉。