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: