[其他] 繁體中文 Windows(CP950)下啟動器 --version 編碼失敗,介面誤報「未安裝」

Author: Willy19928Created Sep 21, 2026Updated Sep 21, 2026
LabelsBug | 工作不正常Triage | 待检查

请确认您已完成以下几件事并勾选项目,未按要求勾选可能被认作无效反馈直接关闭

  • 正在使用最新的 OneDragon
  • 已搜索过 issue 中无人提出相似问题或无解决方案
  • 已为所有模型以及战斗脚本更新至最新版
  • 已经依照 官方文档常见问题排查 进行过问题自查
  • 运行时无任何帧率显示或其他覆盖层窗口遮盖游戏
  • 未认真阅读此处选项随意勾选
  • 未安装任何修改游戏UI和贴图的模组
  • 了解反馈时应携带日志和问题截图,且明白应该使用F11截图
  • 已经修改了此issue的标题为想要反馈的问题简述

代码版本

a91a606

问题类型

Bug

问题范围

其他

问题描述

問題描述

在繁體中文 Windows 環境中,專案根目錄已存在 OneDragon-Launcher.exe,而且啟動器可以正常啟動主程式,但資源更新視窗仍顯示:

未安裝 → v2.5.2

問題不是啟動器檔案不存在,而是啟動器執行 --version 時,嘗試向 CP950 編碼的標準輸出寫入簡體中文「绝区零 一条龙 启动器」,因而發生 UnicodeEncodeError。版本查詢回傳空字串後,介面將空版本顯示成「未安裝」。

重現環境

  • Windows 顯示語言:繁體中文
  • 系統控制台編碼:CP950
  • 啟動器路徑:E:\tools\ZZZ-OD\OneDragon-Launcher.exe
  • 啟動器檔案確實存在,而且可以正常啟動 GUI

重現步驟

  1. 在繁體中文 Windows 環境啟動一條龍。
  2. 等待資源更新檢查。
  3. 資源更新視窗將已存在的啟動器顯示成「未安裝」。
  4. 單獨執行 .\OneDragon-Launcher.exe --version

實際結果

程序結束碼為 1stdout 為空。啟動器在輸出簡體字「绝」(U+7EDD)時發生 CP950 編碼錯誤。

預期結果

  • OneDragon-Launcher.exe --version 在 CP950、GBK 與 UTF-8 等 Windows 編碼環境中都能穩定輸出版本號並正常結束。
  • EXE 存在但版本讀取失敗時,應顯示「版本讀取失敗」,而不是「未安裝」。

相關問題

  • #2719 已處理管理員相容模式及 PyInstaller 環境造成的誤報,但未涵蓋 CP950 輸出編碼失敗。
  • #2786/#2787 處理的是呼叫端解碼啟動器輸出失敗。
  • 本問題發生在啟動器輸出階段:程序已經崩潰且 stdout 為空,因此只修改呼叫端解碼邏輯無法解決。

游戏截图

Image Image

运行日志

執行 OneDragon-Launcher.exe --version 的結果:

returncode = 1
stdout = ''
Traceback (most recent call last):
  File "launcher.py", line 21, in <module>
  File "one_dragon\launcher\launcher_base.py", line 33, in run
  File "one_dragon\launcher\exe_launcher.py", line 49, in main
  File "one_dragon\launcher\exe_launcher.py", line 23, in show_version
  File "colorama\ansitowin32.py", line 210, in write_plain_text
UnicodeEncodeError: 'cp950' codec can't encode character '\u7edd' in position 0: illegal multibyte sequence

其中 \u7edd 是簡體字「绝」。

你的建议

--version 是供程式讀取的介面,建議只輸出 ASCII 版本號:

python
def show_version(self) -> None:
    print(self.version)
    sys.exit(0)

另外建議區分以下狀態:

  1. EXE 不存在:未安裝
  2. EXE 存在但 --version 失敗:版本讀取失敗
  3. 成功讀取版本:正常比較版本

Source: OneDragon-Anything/ZenlessZoneZero-OneDragon