当前位置: 首页 > article >正文

解决Python与Java交互乱码问题:从编码角度优化数据流

在现代软件开发中,跨语言系统的集成已经成为日常工作的一部分。特别是当Python和Java之间进行交互时,编码问题往往会成为导致数据传输错误、乱码以及难以调试的主要原因之一。

你是否曾遇到过这种情境:Python脚本通过标准输出返回了正确的数据,但Java服务读取时却显示乱码?或者,反之,Java中打印的数据在Python中也无法正确显示?

问题的根本原因通常是Python与Java在字符编码处理上的不一致,尤其是UTF-8编码。这篇博客将详细解析如何通过几个简单的步骤,解决Python和Java之间的编码不一致问题,确保数据能够正确、无缝地在两者之间流动。

背景:为什么会出现乱码?

Python与Java在字符编码的处理方式上有所不同。当Python脚本产生输出时,它默认使用系统的编码方式,可能是UTF-8GBK等,而Java通常期望以UTF-8的方式读取标准输出流。如果Python的编码方式与Java读取时的编码不一致,就会导致乱码问题。

问题产生的场景

假设我们有一个Python脚本,它从某个API获取数据并返回。Java服务通过ProcessBuilder执行Python脚本,并从标准输出流中读取返回结果。然而,若没有明确指定编码,Java可能会因默认使用平台编码方式而导致乱码。

解决方案:确保统一的UTF-8编码

我们可以通过几个步骤确保Python和Java之间的编码一致性,避免乱码问题。

步骤 1:修改Python脚本,显式指定编码

首先,我们需要确保Python脚本在输出响应时,明确设置为使用UTF-8编码。

修改Python脚本:

在Python脚本中,我们可以通过设置response.encoding = 'utf-8'来显式设置响应的编码格式。这个步骤确保Python脚本生成的输出始终使用UTF-8编码。

import sys
import requests
import jsondef get_access_token():# 省略获取token的逻辑return "your_access_token"def main():url = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/ernie_speed?access_token=" + get_access_token()content = sys.argv[1]  # 从命令行参数获取输入内容payload = json.dumps({"messages": [{"role": "user", "content": content}]})headers = {'Content-Type': 'application/json'}response = requests.post(url, headers=headers, data=payload)response.encoding = 'utf-8'  # 显式设置编码print(response.text)  # 输出响应内容

通过response.encoding = 'utf-8',我们明确告诉Python使用UTF-8编码来处理响应,这样即使是包含特殊字符的内容,也能正确编码输出。

步骤 2:在Java中设置Python的编码环境变量

Java使用ProcessBuilder执行Python脚本时,默认的编码可能不是UTF-8。为了强制Python输出使用UTF-8编码,我们需要在ProcessBuilder中设置环境变量PYTHONIOENCODING

修改Java服务层代码:

在Java中,使用ProcessBuilder执行Python脚本时,我们可以通过processBuilder.environment().put("PYTHONIOENCODING", "utf-8")来确保Python环境使用UTF-8编码。

import java.io.*;
import java.nio.charset.StandardCharsets;public class PythonExecutorServiceImpl {private static final String PYTHON_EXECUTABLE = "python";private static final String PYTHON_SCRIPT_PATH = "/path/to/your/script.py";public String executeScript(String content) throws IOException {// 创建ProcessBuilder,执行Python脚本ProcessBuilder processBuilder = new ProcessBuilder(PYTHON_EXECUTABLE,PYTHON_SCRIPT_PATH,content);// 设置环境变量,确保Python输出使用UTF-8processBuilder.environment().put("PYTHONIOENCODING", "utf-8");processBuilder.redirectErrorStream(true);// 启动进程并读取输出流Process process = processBuilder.start();InputStreamReader reader = new InputStreamReader(process.getInputStream(), StandardCharsets.UTF_8);BufferedReader bufferedReader = new BufferedReader(reader);StringBuilder output = new StringBuilder();String line;while ((line = bufferedReader.readLine()) != null) {output.append(line).append("\n");}bufferedReader.close();return output.toString();}
}

通过设置环境变量PYTHONIOENCODING,我们确保Python在执行时始终使用UTF-8编码,这样Java就可以正确读取Python的标准输出流。

步骤 3:确保Java读取流时使用UTF-8

在Java中,我们使用InputStreamReader读取进程的输出流时,也需要明确指定编码格式。通过new InputStreamReader(process.getInputStream(), StandardCharsets.UTF_8),我们确保Java以UTF-8编码读取Python的输出。

完整代码示例

Python脚本(model.py)
import sys
import requests
import jsondef get_access_token():# 模拟获取tokenreturn "your_access_token"def main():url = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/ernie_speed?access_token=" + get_access_token()content = sys.argv[1]payload = json.dumps({"messages": [{"role": "user", "content": content}]})headers = {'Content-Type': 'application/json'}response = requests.post(url, headers=headers, data=payload)response.encoding = 'utf-8'  # 显式设置编码print(response.text)if __name__ == '__main__':main()
Java服务层(PythonExecutorServiceImpl.java)
import java.io.*;
import java.nio.charset.StandardCharsets;public class PythonExecutorServiceImpl {private static final String PYTHON_EXECUTABLE = "python";private static final String PYTHON_SCRIPT_PATH = "/path/to/your/script.py";public String executeScript(String content) throws IOException {ProcessBuilder processBuilder = new ProcessBuilder(PYTHON_EXECUTABLE,PYTHON_SCRIPT_PATH,content);// 设置环境变量确保Python输出UTF-8processBuilder.environment().put("PYTHONIOENCODING", "utf-8");processBuilder.redirectErrorStream(true);Process process = processBuilder.start();InputStreamReader reader = new InputStreamReader(process.getInputStream(), StandardCharsets.UTF_8);BufferedReader bufferedReader = new BufferedReader(reader);StringBuilder output = new StringBuilder();String line;while ((line = bufferedReader.readLine()) != null) {output.append(line).append("\n");}bufferedReader.close();return output.toString();}
}

总结

通过这几个简单的步骤,我们可以确保Python脚本和Java服务在数据传输时使用相同的UTF-8编码,从而避免乱码问题。这种方法不仅适用于Python与Java的交互,也可以用于其他语言间的数据传输问题。保持统一的字符编码,是跨语言集成时的一个小细节,但却能有效避免许多潜在的问题,让系统更加稳定、可靠。

在开发过程中,细心地处理字符编码问题是避免麻烦的关键,尤其是涉及到不同语言的集成时。希望通过这篇博客,能够帮助你快速解决Python与Java交互中的乱码问题,提升跨语言开发的效率!

相关文章:

解决Python与Java交互乱码问题:从编码角度优化数据流

在现代软件开发中,跨语言系统的集成已经成为日常工作的一部分。特别是当Python和Java之间进行交互时,编码问题往往会成为导致数据传输错误、乱码以及难以调试的主要原因之一。 你是否曾遇到过这种情境:Python脚本通过标准输出返回了正确的数…...

DES、3DES、SM4 加密算法简介

1. DES(Data Encryption Standard) 设计时间:1975 年(IBM 开发,1977 年被 NIST 采纳为美国联邦标准)。 密钥长度:64 位(实际有效 56 位 8 位校验)。 分组长度&#xf…...

C++异步操作 - future async package_task promise

异步 异步编程是一种程序设计范式,​​允许任务在等待耗时操作(如I/O、网络请求)时暂停执行,转而处理其他任务,待操作完成后自动恢复​​。其核心目标是​​避免阻塞主线程​​,提升程序的并发性和响应速度…...

Feign 深度解析:Java 声明式 HTTP 客户端的终极指南

Feign 深度解析:Java 声明式 HTTP 客户端的终极指南 Feign 是由 Netflix 开源的 ​声明式 HTTP 客户端,后成为 Spring Cloud 生态的核心组件(现由 OpenFeign 维护)。它通过注解和接口定义简化了服务间 RESTful 通信,并…...

08前端项目----升序/降序

升序/降序 vue实现升序/降序服务器处理 vue实现升序/降序 用vue实现升序/降序&#xff0c;以及css绘制三角形 <div class"sui-navbar"><div class"navbar-inner filter"><ul class"sui-nav"><li class"active"&g…...

用Java实现简易区块链:从零开始的探索

&#x1f4e2; 友情提示&#xff1a; 本文由银河易创AI&#xff08;https://ai.eaigx.com&#xff09;平台gpt-4o-mini模型辅助创作完成&#xff0c;旨在提供灵感参考与技术分享&#xff0c;文中关键数据、代码与结论建议通过官方渠道验证。 区块链技术作为近年来的热门话题&am…...

JavaScript 渲染内容爬取实践:Puppeteer 进阶技巧

进一步探讨如何使用 Puppeteer 进行动态网页爬取&#xff0c;特别是如何等待页面元素加载完成、处理无限滚动加载、单页应用的路由变化以及监听接口等常见场景。 一、等待页面元素加载完成 在爬取动态网页时&#xff0c;确保页面元素完全加载是获取完整数据的关键。Puppeteer…...

数据结构——栈以及相应的操作

栈(Stack) 在维基百科中是这样定义的&#xff1a; 堆栈(stack) 又称为栈或堆叠&#xff0c;是计算机科学中的一种抽象资料类型&#xff0c;只允许在有序的线性资料集合中的一端&#xff08;称为堆栈顶端&#xff0c;top&#xff09;进行加入数据&#xff08;push&#xff09;和…...

SVG 与 VSCode:高效设计与开发的完美结合

SVG 与 VSCode:高效设计与开发的完美结合 引言 随着互联网技术的飞速发展,网页设计已经成为了一个重要的领域。SVG(可缩放矢量图形)作为一种矢量图形格式,因其独特的优势,在网页设计中得到了广泛应用。而VSCode(Visual Studio Code)作为一款功能强大的代码编辑器,同…...

如何应对政策变化导致的项目风险

应对政策变化导致的项目风险&#xff0c;核心在于&#xff1a;加强政策研判机制、建立动态应对流程、构建合规应急预案、强化跨部门联动、提升项目柔性与调整能力。其中&#xff0c;加强政策研判机制 是所有防范工作中的“前哨哨兵”&#xff0c;可以让项目团队在政策风向转变之…...

ASP.Net Web Api如何更改URL

1.找到appsettings.json 修改如下&#xff1a; 主要为urls的修改填本机私有地址即可 {"Logging": {"LogLevel": {"Default": "Information","Microsoft.AspNetCore": "Warning"}},"AllowedHosts": &q…...

在 Vue 3 中将拆分后的数组合并回原数组

接上文Vue 3 中按照某个字段将数组分成多个数组_vue3怎么进行数组对象--分割对象-CSDN博客 方法一&#xff1a;使用 flat() 方法 // 假设这是拆分后的多维数组 const splitArrays [[{id: 1, category: A}, {id: 3, category: A}],[{id: 2, category: B}, {id: 5, category: …...

【HTTPS协议原理】数据加密、如何防止中间人攻击、证书和签名、HTTPS完整工作流程

⭐️个人主页&#xff1a;小羊 ⭐️所属专栏&#xff1a;Linux网络 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 数据加密常见的加密方式数据摘要方案一&#xff1a;仅使用对称加密方案二&#xff1a;仅使用非对称加密方案三&#xff1a;双…...

Java中链表的深入了解及实现

一、链表 1.链表的概念 1.1链表是⼀种物理存储结构上⾮连续存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的引⽤链接次序实现的 实际中链表的结构⾮常多样&#xff0c;以下情况组合起来就有8种链表结构&#xff1a; 2.链表的实现 1.⽆头单向⾮循环链表实现 链表中的…...

【武汉理工大学第四届ACM校赛】copy

copy 题目描述代码代码解释&#xff1a; 链接&#xff1a;https://ac.nowcoder.com/acm/contest/108683/E 题目描述 小s苦于在不同的窗口之间复制粘贴&#xff0c; 于是他突发奇想&#xff0c;把所有要复制的内容都复制到了一个剪贴板中&#xff0c;但他突然发现由于他复制的…...

植物大战僵尸杂交版v3.6最新版本(附下载链接)

B站游戏作者潜艇伟伟迷于4月19日更新了植物大战僵尸杂交版3.6版本&#xff01;&#xff01;&#xff01;&#xff0c;有b站账户的记得要给作者三连关注一下呀&#xff01; 不多废话下载链接放上&#xff1a; 夸克网盘链接&#xff1a;&#xff1a;https://pan.quark.cn/s/1af9b…...

【Ansible】批量管理 Windows自动化运维

一&#xff0c;前期准备 1&#xff0c;控制端&#xff08;Linux&#xff09;的要求 Ansible可以在安装了Python 2&#xff08;2.7版&#xff09;或Python 3&#xff08;3.5及更高版本&#xff09;的任何机器上运行。控制端计算机不支持Windows。 2&#xff0c;客户端&#x…...

【源码】【Java并发】【ThreadLocal】适合中学者体质的ThreadLocal源码阅读

&#x1f44b;hi&#xff0c;我不是一名外包公司的员工&#xff0c;也不会偷吃茶水间的零食&#xff0c;我的梦想是能写高端CRUD &#x1f525; 2025本人正在沉淀中… 博客更新速度 &#x1f44d; 欢迎点赞、收藏、关注&#xff0c;跟上我的更新节奏 &#x1f4da;欢迎订阅专栏…...

背包问题模板

文章目录 01背包题意思路代码优化 完全背包题意思路代码优化 多重背包题意思路代码优化 分组背包题意思路代码 01背包 特点&#xff1a;每件物品最多只能用一次 01背包问题 题意 给出每件物品的体积v,价值w,求解能装入背包的的物品的最大价值&#xff0c;并且每件物品只能选一…...

Redis 处理读请求

在前文“Redis 接收连接”中&#xff0c;Redis 将接收的客户端连接加入了 epoll 中监听&#xff0c;同时还设置了读事件处理器 connSocketEventHandler。 假设现在客户端向 Redis 发来一条 set key value 命令。 事件循环 aeProcessEvents 在事件循环 aeProcessEvents 中会调…...

Sentinel源码—8.限流算法和设计模式总结二

大纲 1.关于限流的概述 2.高并发下的四大限流算法原理及实现 3.Sentinel使用的设计模式总结 3.Sentinel使用的设计模式总结 (1)责任链模式 (2)监听器模式 (3)适配器模式 (4)模版方法模式 (5)策略模式 (6)观察者模式 (1)责任链模式 一.责任链接口ProcessorSlot 二.责…...

VulnHub-DarkHole_1靶机渗透教程

VulnHub-DarkHole_1靶机渗透教程 1.靶机部署 [Onepanda] Mik1ysomething 靶机下载&#xff1a;https://download.vulnhub.com/darkhole/DarkHole.zip 直接使用VMware打开就行 导入成功&#xff0c;打开虚拟机&#xff0c;到此虚拟机部署完成&#xff01; 注意&#xff1a…...

Keil MDK‑5 中使用 GNU ARM GCC 的 -Wno-* 选项屏蔽编译警告

在项目编译过程中&#xff0c;我们常常会遇到许多警告提示&#xff1b;而在有些情况下&#xff0c;当我们已经了解这些警告的原因时&#xff0c;可以选择忽略它们&#xff0c;从而减少干扰&#xff0c;集中精力修复其他更重要的问题。 一、添加屏蔽警告的编译选项 &#xff08…...

边缘计算全透视:架构、应用与未来图景

边缘计算全透视&#xff1a;架构、应用与未来图景 一、产生背景二、本质三、特点&#xff08;一&#xff09;位置靠近数据源&#xff08;二&#xff09;分布式架构&#xff08;三&#xff09;实时性要求高 四、关键技术&#xff08;一&#xff09;硬件技术&#xff08;二&#…...

爬虫学习——下载文件和图片、模拟登录方式进行信息获取

一、下载文件和图片 Scrapy中有两个类用于专门下载文件和图片&#xff0c;FilesPipeline和ImagesPipeline&#xff0c;其本质就是一个专门的下载器&#xff0c;其使用的方式就是将文件或图片的url传给它(eg:item[“file_urls”])。使用之前需要在settings.py文件中对其进行声明…...

路由器转发规则设置方法步骤,内网服务器端口怎么让异地连接访问的实现

在路由器上设置端口转发&#xff08;Port Forwarding&#xff09;可以将外部网络流量引导到特定的局域网设备&#xff0c;这对于需要远程访问服务器、摄像头、游戏主机等设备非常有用。 登录路由器管理界面&#xff0c;添加端口转发规则让外网访问内网的实现教程分享。以下是设…...

MQ底层原理

RabbitMQ 概述 RabbitMQ 是⼀个开源的⾼性能、可扩展、消息中间件&#xff08;Message Broker&#xff09;&#xff0c;实现了 Advanced Message Queuing Protocol&#xff08;AMQP&#xff09;协议&#xff0c;可以帮助不同应⽤程序之间进⾏通信和数据交换。RabbitMQ 是由 E…...

本地部署DeepSeek-R1模型接入PyCharm

以下是DeepSeek-R1本地部署及接入PyCharm的详细步骤指南,整合了视频内容及官方文档核心要点: 一、本地部署DeepSeek-R1模型 1. 安装Ollama框架 ​下载安装包 访问Ollama官网(https://ollama.com/download)Windows用户选择.exe文件,macOS用户选择.dmg包。 ​安装验证 双击…...

jvm-描述符与特征签名的区别

在Java虚拟机&#xff08;JVM&#xff09;中&#xff0c;存储的是方法签名&#xff0c;而不是仅仅方法描述符。方法签名包含了方法的参数类型和返回值类型的信息&#xff0c;而方法描述符通常指的是仅包含参数类型的那部分信息。为了更清晰地理解这两者的区别以及它们如何在JVM…...

Java基于SpringBoot的企业车辆管理系统,附源码+文档说明

博主介绍&#xff1a;✌Java老徐、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&…...