Ubuntu下JSP乱码问题,一步步排查根治
在Ubuntu上搞JSP开发,乱码问题几乎是绕不过去的坎。很多时候,页面上的中文字符要么变成问号,要么乱成一团,排查起来还挺头疼。其实,乱码的根本原因就是编码不一致——文件保存的编码、页面声明的编码、服务器解析的编码、数据库连接的编码,但凡有一处没对上,就会出问题。下面把这几个环节拆开来讲,按顺序检查一遍,基本就能解决。
1. 确认所有文件的编码
所有JSP、HTML、CSS、Ja vaScript等静态文件,都要确保是以UTF-8格式保存的。这个细节最基础,但也最容易被忽略。用VSCode或Sublime Text打开文件,通过“文件→另存为”看看当前编码,如果不是UTF-8,就切换并保存。Sublime里需要在保存时选择“UTF-8”格式才行。

2. 在JSP页面顶部声明编码
每个JSP页面的开头,都要加上这样一行指令,明确告诉Tomcat这个页面用的是UTF-8编码:
<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %>
同时,在HTML的标签里加上meta标签,让浏览器也知道用UTF-8来解析页面:
这一步是双重保险,避免浏览器用默认的ISO-8859-1来解读页面内容,导致乱码。
3. 配置Tomcat的URI编码
编辑Tomcat的server.xml文件(通常在/etc/tomcat9/server.xml或/opt/tomcat/conf/server.xml),找到处理HTTP请求的标签(默认端口8080),加上URIEncoding="UTF-8"属性:
这一步主要解决GET请求参数中中文乱码的问题。POST请求的参数乱码通常由后面的过滤器统一处理。
4. 数据库连接加上编码参数
如果JSP页面要从数据库读取中文数据,JDBC连接字符串必须指定编码。以MySQL为例,在URL后面加上useUnicode=true&characterEncoding=UTF-8:
String url = "jdbc:mysql://localhost:3306/your_database?useUnicode=true&characterEncoding=UTF-8";
其他数据库(Oracle、PostgreSQL等)也有类似参数,需要根据驱动文档来设置。核心思想是让数据库与应用程序的编码保持一致。
5. 检查Ubuntu系统默认编码
在终端输入locale,看看系统语言环境是不是UTF-8。如果不是,可以临时设置:
export LANG=zh_CN.UTF-8export LC_ALL=zh_CN.UTF-8
想要永久生效,就把这两行加到~/.bashrc或~/.profile里,然后执行source ~/.bashrc使其生效。
6. 编写一个字符编码过滤器
最省心的办法是写一个Filter,拦截所有请求,统一设置请求和响应的编码为UTF-8。这样就不用每个Servlet都重复写request.setCharacterEncoding了。代码示例:
import ja vax.servlet.*;
import ja vax.servlet.annotation.WebFilter;
import ja va.io.IOException;
@WebFilter("/*")
public class CharacterEncodingFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
chain.doFilter(request, response);
}
// init 和 destroy 方法可以留空
}
这个Filter会处理所有GET和POST请求,无论是参数还是请求体,都能保证UTF-8编码。
7. 表单提交也需要指定编码
如果页面里有表单,记得在标签里加上accept-charset="UTF-8"属性:
这一步能防止表单数据在传输过程中被浏览器用其他编码提交,导致后端收到乱码。
以上七个环节,只要都按UTF-8统一起来,Ubuntu上的JSP乱码问题基本就能根治。遇到乱码时,不必慌,按这个清单逐一排查,总能找到症结所在。
