Java中文乱码问题是Java开发中常见的问题之一,尤其在处理字符串、文件读写、网络传输以及数据库操作时经常遇到。中文乱码问题主要是由于字符编码不一致所导致的。
在解决这个问题之前,我们需要先理解几个基本概念:
要解决Java中文乱码问题,可以从以下几个方面入手:
1. 统一项目编码
?useUnicode=true&characterEncoding=UTF-8
。
指定页面编码为UTF-8。对于JSP页面,可以在页面顶部通过<%@ page contentType="text/html; charset=UTF-8"%>
指定编码。new String(str.getBytes("原编码"), "目标编码")
进行转换。2. 正确处理HTTP请求和响应编码
request.setCharacterEncoding("UTF-8")
确保请求数据按UTF-8解码。response.setContentType("text/html; charset=UTF-8")
。3. 文件读写指定编码
InputStreamReader
和OutputStreamWriter
时,可以通过构造函数指定编码,例如new InputStreamReader(new FileInputStream(file), "UTF-8")
。4. 网络传输编码处理
Content-Type
,例如application/json; charset=UTF-8
。5. 处理第三方数据源或API
6. 使用过滤器统一处理字符编码
7. 充分测试
1. Servlet接收中文参数乱码
场景:通过GET或POST方式提交的表单中包含中文字符,接收时出现乱码。
解决:
doPost
方法中使用request.setCharacterEncoding("UTF-8")
来设置请求体的编码。server.xml
中的
标签添加URIEncoding="UTF-8"
属性。2. JSP页面中文乱码
场景:JSP页面显示数据库中的中文数据时出现乱码。
解决:
<%@ page contentType="text/html; charset=UTF-8"%>
。3. 数据库存储中文乱码
场景:将中文数据存入数据库时或从数据库读取中文数据时出现乱码。
解决:
CHARACTER SET utf8mb4
。?useUnicode=true&characterEncoding=UTF-8
。4. 文件读写中文乱码
场景:Java程序读取或写入包含中文的文件时出现乱码。
解决:
InputStreamReader
和OutputStreamWriter
时,显式指定字符编码,如new InputStreamReader(new FileInputStream(file), "UTF-8")
。5. HTTP响应中文乱码
场景:Servlet或Spring MVC控制器返回中文数据到前端时出现乱码。
解决:
response.setContentType("text/html; charset=UTF-8")
。6. AJAX请求返回中文乱码
场景:使用AJAX请求后端接口,返回的JSON或XML中包含中文时出现乱码。
解决:
Content-Type
,如application/json; charset=UTF-8
。7. 日志文件中文乱码
场景:Java应用程序写入的日志文件中的中文显示为乱码。
解决:
8. URL中的中文参数乱码
场景:在URL中传递中文参数时,服务器端接收到的中文乱码。
解决:
URLEncoder.encode(param, "UTF-8")
),在服务器端进行相应的URL解码。9. WebService接口中文乱码
场景:调用或提供的WebService接口,传递的SOAP消息中包含中文时出现乱码。
解决:
Content-Type
头部正确设置为text/xml; charset=UTF-8
。10. 控制台输出中文乱码
场景:Java程序在IDE或命令行控制台输出中文时出现乱码。
解决:
chcp 65001
。11. Excel文件导入导出中文乱码
场景:使用Apache POI等库处理Excel文件时,导入或导出的Excel文件中的中文出现乱码。
解决:
HSSFWorkbook
或XSSFWorkbook
对象读写字符串时,确保Java字符串已正确地以UTF-8编码。12. Maven项目编译中文乱码
场景:在Maven项目中,编译过程中出现中文字符乱码。
解决:
pom.xml
中配置maven-compiler-plugin
插件,设置UTF-8
确保源码编译时使用UTF-8编码。13. JavaMail发送邮件中文主题或内容乱码
场景:使用JavaMail API发送邮件时,邮件的主题或内容包含中文字符出现乱码。
解决:
message.setContent(text, "text/html;charset=UTF-8")
。MimeUtility.encodeText(subject, "UTF-8", "B")
。14. Java RMI传输中文乱码
场景:使用Java RMI(Remote Method Invocation)远程调用传输中文字符串时出现乱码。
解决:
15. Java Socket通信中文乱码
场景:通过Socket进行网络通信时,发送或接收的中文消息出现乱码。
解决:
new String(bytes, "UTF-8")
和str.getBytes("UTF-8")
确保以UTF-8编码处理字符串。16. MyBatis映射文件中文乱码
场景:在MyBatis的映射文件中直接写入的中文SQL语句出现乱码。
解决:
的useGeneratedKeys
和defaultExecutorType
等属性时,确保文件编码正确。17. JavaFX界面中文乱码
场景:在JavaFX应用程序中,界面上的中文字符显示为乱码。
解决:
FXMLLoader.load(resource, null, new JavaFXBuilderFactory(), null, Charset.forName("UTF-8"))
。18. Java Properties文件中文乱码
场景:从.properties
配置文件中读取的中文字符串出现乱码。
解决:
native2ascii
工具将含有中文的.properties
文件转换为Unicode编码,或者在代码中使用new String(properties.getProperty(key).getBytes("ISO-8859-1"), "UTF-8")
转换。19. Java JNI调用中文参数或返回值乱码
场景:通过Java JNI(Java Native Interface)调用本地代码时,传递的中文参数或从本地代码返回的中文字符串出现乱码。
解决:
GetStringUTFChars
和NewStringUTF
等函数确保中文字符串的正确转换。20. Tomcat日志中文乱码
场景:在Tomcat服务器的日志文件中,打印的中文信息显示为乱码。
解决:
logging.properties
文件,设置java.util.logging.ConsoleHandler.encoding = UTF-8
和java.util.logging.FileHandler.encoding = UTF-8
,确保日志输出以UTF-8编码。21. JSP页面表单提交中文乱码
场景:在JSP页面通过表单提交中文数据到服务器时,服务器接收到的中文数据出现乱码。
解决:
request.setCharacterEncoding("UTF-8")
设置请求的字符编码为UTF-8。22. JSON数据传输中文乱码
场景:通过HTTP接口传输JSON数据时,包含的中文字符出现乱码。
解决:
Content-Type
为application/json; charset=UTF-8
。23. WebSocket传输中文乱码
场景:通过WebSocket发送和接收包含中文的消息时出现乱码。
解决:
24. Java Servlet输出中文乱码
场景:在Servlet中向客户端输出中文数据时,客户端接收到的中文出现乱码。
解决:
response.setCharacterEncoding("UTF-8")
设置响应的字符编码,并通过response.setContentType("text/html; charset=UTF-8")
设置内容类型及编码。25. Spring Boot中的中文乱码
场景:在Spring Boot应用程序中,返回的中文JSON数据或视图中的中文字符出现乱码。
解决:
application.properties
或application.yml
配置文件中设置Spring MVC的编码为UTF-8,例如:spring.mvc.charset=UTF-8
和spring.http.encoding.force=true
。26. Log4j/Logback日志中文乱码
场景:使用Log4j或Logback记录日志时,日志文件中的中文字符出现乱码。
解决:
UTF-8
。27. Apache HttpClient请求响应中文乱码
场景:使用Apache HttpClient进行HTTP请求时,响应体包含的中文出现乱码。
解决:
Accept-Charset
为UTF-8
。28. JPA/Hibernate查询结果中文乱码
场景:使用JPA或Hibernate进行数据库操作时,查询结果中的中文字符出现乱码。
解决:
?useUnicode=true&characterEncoding=UTF-8
。29. FTP文件传输中文乱码
场景:通过FTP传输包含中文文件名或中文内容的文件时,文件名或内容出现乱码。
解决:
FTPClient.setControlEncoding("UTF-8")
。30. XML处理中的中文乱码
场景:解析或生成XML文档时,包含的中文字符出现乱码。
解决:
。