Java利用Runtime调用Python脚本时的中文乱码问题

本文解决Java调用Python脚本时的中文乱码问题。通过在Python脚本中设置标准输出和错误输出的编码为UTF-8,并在Java端以UTF-8编码读取输出流和错误流,实现正确显示中文。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、问题描述

最近项目用Python写后台,用Java写前端,遇到用Runtime.getRuntime.exec()调用Python脚本时,Java端捕获脚本输出中文乱码的问题(无处不在的中文乱码...)。

 二、解决方法

 Java端调用Runtime.getRuntime.exec()运行脚本时会建立三根管道,分别用于传输被调用脚本的输入信息、输出信息、错误信息。

process = Runtime.getRuntime().exec(arg);
//获取脚本的输出流
OutputStream output = process.getOutputStream();
//获取脚本的错误流
InputStream error = process.getErrorStream();
//用UTF-8编码格式将读取到的字节解码为字符
InputStreamReader outputReader= new InputStreamReader(output,"utf-8");
InputStreamReader errorReader= new InputStreamReader(error,"utf-8");

当被调用的节本有中文输出的时候,还是乱码!!!因为Python安装在Windows环境下的默认编码格式是GBK!!!

我的解决办法:在被调用的脚本中增加如下代码

import io
import sys

sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8')
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')

 注:一定要添加到其他依赖模块import之前(掉坑里差点没爬起来)

 

Java中,你可以使用`Runtime.getRuntime().exec()`方法来执行Python脚本,并通过标准输入和输出来与之交互。如果你想要调用Python脚本中的特定函数,首先你需要编写Python脚本,该脚本应该包含一个可以接收命令行参数并执行相应操作的函数。 以下是一个简单的步骤示例: 1. **创建Python脚本**: Python脚本文件(例如`script.py`): ```python def run_function(param): print(f"Running function with parameter: {param}") ``` 2. **Java代码部分**: 使用`Runtime.exec`执行Python脚本并传递参数给指定函数: ```java import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.Scanner; public class Main { public static void main(String[] args) throws Exception { String pythonScript = "script.py"; // Python脚本路径 String functionName = "run_function"; // 要调用的函数名 String functionParam = "example_param"; // 函数参数 Process process = Runtime.getRuntime().exec("python " + pythonScript); Scanner scanner = new Scanner(process.getInputStream()); try { // 假设你的Python函数返回结果是打印在控制台的 String output = scanner.nextLine(); System.out.println("Python Function Output: " + output); // 如果你想直接调用函数而不是获取输出,可以用以下方式(这依赖于你的脚本结构) // process.getOutputStream().write((functionName + "(" + functionParam + ")").getBytes()); // process.getOutputStream().flush(); } finally { scanner.close(); } } } ``` 请注意,上述代码假定Python脚本能从命令行接受参数并在控制台上输出。如果函数需要更复杂的交互,可能需要处理进程的标准输入和错误流(process.getErrorStream())以及使用其他机制,如序列化数据或网络通信。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值