根本原因是Java与Python间编码未对齐:Java用UTF-16,Python进程默认按系统编码(如GBK)解析参数或输入;解决关键是强制Python使用UTF-8——设环境变量PYTHONIOENCODING=utf-8和PYTHONUTF8=1,Java端用StandardCharsets.UTF_8读取输出,并在Python脚本中声明utf-8编码及运行时加固。

Java 调用 Python 脚本传中文参数时出现乱码,根本原因是 Java 字符串在跨进程或跨解释器传递过程中,编码未对齐——Java 默认按 UTF-16 处理字符串,而 Python 进程启动时可能按系统默认编码(如 Windows 的 GBK)解析命令行参数或标准输入,导致中文“被误读”。
确保 Python 进程启动时使用 UTF-8 编码
这是最关键的一步。Java 启动 Python 进程时,必须显式告知 Python 使用 UTF-8 处理 I/O 和命令行参数:
- 通过 环境变量设置:
PYTHONIOENCODING=utf-8(影响sys.stdout/stderr)和PYTHONUTF8=1(Python 3.7+ 强制启用 UTF-8 模式,覆盖系统 locale) - 在 ProcessBuilder 中配置:
ProcessBuilder pb = new ProcessBuilder("python", "script.py", "你好世界");
Map<String, String> env = pb.environment();
env.put("PYTHONIOENCODING", "utf-8");
env.put("PYTHONUTF8", "1");
正确读取 Python 的输出(含中文返回值)
即使参数传对了,Java 读取 Python 的 stdout 仍可能乱码。不能依赖系统默认编码:
- 务必用
InputStreamReader显式指定字符集:
BufferedReader in = new BufferedReader(
new InputStreamReader(process.getInputStream(), StandardCharsets.UTF_8)); - 若 Python 运行在旧版 Windows CMD 下且无法改环境,可临时降级为
GBK,但不推荐长期使用
Python 脚本内统一编码处理
避免依赖隐式行为,脚本开头主动加固:
立即学习“Java免费学习笔记(深入)”;
- 文件头声明:
# -*- coding: utf-8 -*- - Python 3.7+ 推荐加运行时配置(尤其处理
sys.argv): import sys
if sys.stdout.encoding != 'utf-8':
sys.stdout.reconfigure(encoding='utf-8')
if hasattr(sys, 'argv') and len(sys.argv) > 1:
# 确保 argv 中文能正常 decode(Windows 下有时需手动 decode)
args_utf8 = [arg.encode('latin1').decode('utf-8') if isinstance(arg, str) else arg for arg in sys.argv]
替代方案:避免命令行传参,改用标准输入流
命令行参数在某些系统上对 UTF-8 支持不稳定(尤其 Windows)。更可靠的方式是让 Python 从 stdin 读取 JSON 或纯文本:
- Java 端写入 UTF-8 编码的字符串到
process.getOutputStream() - Python 端用
sys.stdin.buffer.read().decode('utf-8')安全读取 - 这样完全绕过命令行编码陷阱,适合含大量中文或结构化数据的场景


















