From 6b2c87dc18a4fc237d55e77c7ce431b8e86af6b6 Mon Sep 17 00:00:00 2001 From: MikiVL Date: Thu, 7 May 2026 11:41:55 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20Windows=20=E7=BC=96?= =?UTF-8?q?=E7=A0=81=E9=97=AE=E9=A2=98=E5=AF=BC=E8=87=B4=E7=94=9F=E6=88=90?= =?UTF-8?q?=E5=A4=B1=E8=B4=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Windows 默认编码为 GBK,Python stdout 输出含中文的 JSON 时 Node.js 端无法正确解析,导致批量生成操作静默失败。 - python/main.py:启动时强制 stdin/stdout 使用 UTF-8 - templateIpc.js:spawn 传入 PYTHONUTF8=1,改用 Buffer 拼接后 UTF-8 解码 Co-Authored-By: Claude Sonnet 4.6 --- electron/ipc/templateIpc.js | 15 +++++++++------ python/main.py | 5 +++++ 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/electron/ipc/templateIpc.js b/electron/ipc/templateIpc.js index fa6e302..ec5e7ea 100644 --- a/electron/ipc/templateIpc.js +++ b/electron/ipc/templateIpc.js @@ -18,16 +18,19 @@ const PYTHON_BIN = app.isPackaged function callPython(payload) { return new Promise((resolve, reject) => { const isPackaged = app.isPackaged; + // PYTHONUTF8=1 确保 Windows 上 Python 使用 UTF-8 编码 + const spawnEnv = { ...process.env, PYTHONUTF8: "1" }; const proc = isPackaged - ? spawn(PYTHON_BIN) - : spawn(process.env.PYTHON_PATH || "python3", [PYTHON_BIN]); + ? spawn(PYTHON_BIN, [], { env: spawnEnv }) + : spawn(process.env.PYTHON_PATH || "python3", [PYTHON_BIN], { env: spawnEnv }); - let stdout = ""; - proc.stdout.on("data", (d) => (stdout += d)); - proc.stderr.on("data", (d) => console.error("[python]", d.toString())); + const chunks = []; + proc.stdout.on("data", (d) => chunks.push(d)); + proc.stderr.on("data", (d) => console.error("[python]", d.toString("utf8"))); proc.on("close", () => { + const stdout = Buffer.concat(chunks).toString("utf8").trim(); try { - resolve(JSON.parse(stdout.trim())); + resolve(JSON.parse(stdout)); } catch (e) { reject(new Error("Python 返回了无效 JSON: " + stdout)); } diff --git a/python/main.py b/python/main.py index b0e53e0..b7ad9fb 100644 --- a/python/main.py +++ b/python/main.py @@ -1,5 +1,10 @@ import sys import json +import io + +# Windows 默认编码不是 UTF-8,强制设置 +sys.stdin = io.TextIOWrapper(sys.stdin.buffer, encoding="utf-8") +sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8", line_buffering=True) def main(): for line in sys.stdin: