解决java调用python代码返回值中文乱码问题

 更新时间:2024年05月13日 11:27:31   作者:字符搬运工s  
这篇文章主要介绍了解决java调用python代码返回值中文乱码问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

网上现有的无法正确解决的方法

如下:

  • data.encode(‘utf-8’, errors=‘ignore’).decode(‘utf-8’)。(使用python中的编码和解码)
  • 在头部加上# encoding:utf-8等方式
  • 修改python文件的编码格式(在setting里面设置file Ecoding编码)修改java的虚拟机输出参数
  • 使用new String(result.getBytes(“iso8859-1”),“utf-8”)转换等

一、乱码原因分析

通常出现乱码情况的时候,我们第一反应是文件编码设置是不是一样的,但这里通过Java调用python代码执行时,所有编码格式都是“UTF-8”,所以不存在这样的问题。

而之所以乱码,是因为python的print函数机制问题。

我们通过执行如下python代码,可以输出print函数输出的默认编码格式。 

Python代码

import locale
print(locale.getdefaultlocale())

代码执行结果

('zh_CN', 'cp936')

通过查阅我们可以知道“cp936”代表的是GB2312,即为中文编码。

二、正确解决方案

测试可用的方法有两种,一种在Java代码设置,另一种在Python代码中设置。

2.1 方法1——在Java代码中设置编码格式

这里使用Process和Runtime调用python代码,然后将获取到的输入流编码设置为"gb2312"

try {
	String result = "";
	//这个方法是类似隐形开启了命令执行器,输入指令执行python脚本
	String exe = "python解释器所处的绝对路径";
	String py = "python代码文件绝对地址";
	Process process = Runtime.getRuntime().exec(exe + " " + py);
	//这种方式获取返回值的方式是需要用python打印输出,然后java去获取命令行的输出,在java返回
	
	//获取结果的同时设置输入流编码格式"gb2312"
	InputStreamReader isr = new InputStreamReader(process.getInputStream(),"gb2312");
	LineNumberReader input = new LineNumberReader(isr);
	result = input.readLine();
	input.close();
	isr.close();
	
	int re = process.waitFor();
	System.out.println(result);
} catch (InterruptedException | IOException e) {
	System.out.println("调用python脚本并读取结果时出错:" + e.getMessage());
}

注意: 不能读取完字节流再次使用getByte重新编码,否则将会得到另一种乱码输出。

错误代码如下:

InputStreamReader isr = new InputStreamReader(process.getInputStream(),"gb2312");
LineNumberReader input = new LineNumberReader(isr);
result = input.readLine();
result1 = new String(result.getBytes("iso8859-1"),"utf-8");
input.close();
isr.close();
System.out.println(result1);

2.2 方法2——在Python代码中设置编码格式

当不确定在Java中会使用什么方式调用python代码时(如不使用Process),可以在python代码中直接设置编码格式。

设置代码如下:

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

总结

至此,乱码问题得到解决。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 接口隔离原则_动力节点Java学院整理

    接口隔离原则_动力节点Java学院整理

    这篇文章主要介绍了接口隔离原则,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • Spring Boot启动端口修改方法

    Spring Boot启动端口修改方法

    spring boot是个好东西,可以不用容器直接在main方法中启动,而且无需配置文件,方便快速搭建环境。下面通过本文给大家分享Spring Boot修改启动端口的方法,感兴趣的的朋友一起看看吧
    2017-07-07
  • Nacos配置的多文件加载与共享配置方式

    Nacos配置的多文件加载与共享配置方式

    这篇文章主要介绍了Nacos配置的多文件加载与共享配置方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • Java项目中如何访问WEB-INF下jsp页面

    Java项目中如何访问WEB-INF下jsp页面

    这篇文章主要介绍了Java项目中如何访问WEB-INF下jsp页面,文章通过示例代码和图文解析介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • Spring如何集成ibatis项目并实现dao层基类封装

    Spring如何集成ibatis项目并实现dao层基类封装

    这篇文章主要介绍了Spring如何集成ibatis项目并实现dao层基类封装,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • 基于传递list类型的参数的问题

    基于传递list类型的参数的问题

    这篇文章主要介绍了基于传递list类型的参数的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • Java仿文库的基本方法(openoffice+swftools+flexPaper)

    Java仿文库的基本方法(openoffice+swftools+flexPaper)

    这篇文章主要为大家详细介绍了Java仿文库的基本方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-02-02
  • java tostring方法重写代码示例

    java tostring方法重写代码示例

    这篇文章主要介绍了java tostring方法重写代码示例,具有一定参考价值,需要的朋友可以了解下。
    2017-10-10
  • IntelliJ IDEA下Maven创建Scala项目的方法步骤

    IntelliJ IDEA下Maven创建Scala项目的方法步骤

    这篇文章主要介绍了IntelliJ IDEA下Maven创建Scala项目的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-06-06
  • idea中一键自动生成序列化serialVersionUID方式

    idea中一键自动生成序列化serialVersionUID方式

    这篇文章主要介绍了idea中一键自动生成序列化serialVersionUID方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09

最新评论