编码不一致,也就是说,文件在“保存时”使用的编码、在“编译时”使用的编码、在“运行时”(控制台、IDE)显示的编码,这三者不匹配。

下面我将从最常见到最不常见的原因,为你提供一套完整的解决方案。
第一步:检查并统一项目编码(最关键、最常见)
这是解决90%以上乱码问题的根本方法,我们需要确保整个项目的编码都设置为 UTF-8。
设置项目编码
- 操作路径:在 MyEclipse 的 Package Explorer(包资源管理器)中,右键点击你的项目名称 -> Properties(属性)。
- 设置步骤:
- 在弹出的属性窗口中,找到并点击 Resource(资源)。
- 在右侧的 Text file encoding(文本文件编码)下拉菜单中,选择 Other,然后在其旁边的输入框中选择或输入 UTF-8。
- 点击 Apply(应用)和 OK(确定)。
设置 IDE 编码
- 操作路径:MyEclipse 菜单栏 -> Window -> Preferences(偏好设置)。
- 设置步骤:
- 在偏好设置窗口中,导航到 General -> Workspace。
- 在右侧的 Text file encoding(文本文件编码)下拉菜单中,选择 Other,然后选择 UTF-8,这确保了 MyEclipse 自身工作环境的编码。
- 点击 Apply and Close(应用并关闭)。
设置 JSP 文件编码
- 操作路径:同样在 Window -> Preferences 中。
- 设置步骤:
- 导航到 MyEclipse -> JSP -> JSP Files。
- 在右侧的 Encoding(编码)下拉菜单中,选择 UTF-8。
- 点击 Apply and Close。
设置 Tomcat(或服务器)的编码
如果乱码出现在 Web 应用的请求响应中(比如接收表单数据、向页面输出中文),那么服务器的编码配置至关重要。
- 对于 Tomcat:
- 找到你项目中配置的 Tomcat 安装目录。
- 编辑
conf/server.xml文件。 - 找到
<Connector>标签,在其中添加URIEncoding="UTF-8"属性,修改后应如下所示:<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8" /> - 重启 Tomcat 服务器。
第二步:检查并修改源代码文件编码
如果项目已经设置为 UTF-8,但某个文件本身是其他编码(如 GBK),它依然会乱码。

检查并转换文件编码
- 操作路径:在 Package Explorer 中,右键点击出现乱码的 .java 文件 -> Properties(属性)。
- 设置步骤:
- 在属性窗口中,查看 Text file encoding,如果不是 UTF-8,点击 Convert(转换)按钮。
- 在弹出的转换窗口中,选择源编码(如果你的文件是中文Windows环境下创建的,通常是
GBK),然后目标编码选择UTF-8。 - 点击 Finish,MyEclipse 会帮你将文件内容转换为 UTF-8 编码并保存。
第三步:检查代码中的硬编码字符和编译器设置
Java 源代码文件头声明
在 .java 文件的第一行,可以加上编码声明,告诉编译器这个文件是什么编码。
// 推荐使用,更通用
// @(#) MyJavaFile.java 1.0 YYYY/MM/DD
// 编码声明,必须放在第一行
// 注意:即使项目设置了UTF-8,加上这句也无害,是一种好习惯
// 编译器会优先使用这个声明
// file encoding: UTF-8
package com.example;
public class MyClass {
// ...
}
检查编译器参数
MyEclipse 底层使用 Eclipse 或其自己的编译器,有时编译器参数会覆盖项目设置。
- 操作路径:右键项目 -> Properties -> Java Compiler -> Build Path 选项卡。
- :确保没有添加
-encoding参数来强制使用其他编码,如果项目设置为 UTF-8,这里应该为空或也是-encoding UTF-8。
第四步:针对不同场景的解决方案
控制台输出乱码
- 问题:
System.out.println("你好");输出为问号或乱码。 - 原因:MyEclipse 控制台使用的编码与程序输出编码不一致。
- 解决方案:
- 临时解决方案(仅对当前输出有效):在代码中设置 System.out 的编码。
System.setOut(new PrintStream(System.out, true, "UTF-8")); System.out.println("你好"); - 永久解决方案(推荐):设置 MyEclipse 控制台的编码。
- 找到控制台视图右上角的 齿轮状图标(显示为
Console)。 - 点击它,选择 Preferences。
- 在弹出的窗口中,将 File encoding 设置为 UTF-8。
- 关闭控制台,重新运行程序,新的控制台视图会使用新的编码设置。
- 找到控制台视图右上角的 齿轮状图标(显示为
- 临时解决方案(仅对当前输出有效):在代码中设置 System.out 的编码。
Web 应用请求/响应乱码
-
请求乱码(POST 请求):
- 解决方案:在获取请求参数之前,设置请求体的编码。
// 在 Servlet 的 doPost 方法开头 request.setCharacterEncoding("UTF-8"); String username = request.getParameter("username");
- 解决方案:在获取请求参数之前,设置请求体的编码。
-
响应乱码:
(图片来源网络,侵删)- 解决方案:在向客户端输出内容之前,设置响应的编码。
// 在 Servlet 的 doGet 或 doPost 方法开头 response.setContentType("text/html;charset=UTF-8"); response.setCharacterEncoding("UTF-8"); PrintWriter out = response.getWriter(); out.println("你好,世界!");
- 解决方案:在向客户端输出内容之前,设置响应的编码。
-
GET 请求乱码:
- 原因:GET 请求的参数在 URL 中,Tomcat 默认使用
ISO-8859-1编码来解码 URL。 - 解决方案:手动进行编码转换。
String username = request.getParameter("username"); // 将 ISO-8859-1 编码的字节数组重新用 UTF-8 解码 username = new String(username.getBytes("ISO-8859-1"), "UTF-8");
- 原因:GET 请求的参数在 URL 中,Tomcat 默认使用
总结与排查流程
如果你遇到乱码问题,请按照以下顺序进行排查,这能高效地解决问题:
- 全局设置:将 项目编码、工作空间编码、JSP 编码 全部统一设置为 UTF-8,这是最重要的一步。
- 文件检查:右键乱码的
.java文件 -> Properties -> Convert,将其编码也转换为 UTF-8。 - 重启 IDE:完成以上设置后,完全关闭 MyEclipse 并重新打开,确保所有新设置生效。
- 控制台检查:如果控制台乱码,单独设置控制台的编码为 UTF-8。
- Web 应用检查:如果是 Web 项目,检查
server.xml中的URIEncoding,并在 Servlet 中正确设置request.setCharacterEncoding和response.setContentType。
遵循以上步骤,你的 MyEclipse Java 乱码问题应该就能得到彻底解决,祝你编码顺利!
