JSP页面在CentOS上显示乱码的核心原因是字符编码设置不一致(包括JSP文件本身、HTTP响应头、服务器配置、数据库连接等环节)。以下是针对性的解决步骤:
确保JSP页面顶部明确指定pageEncoding(JSP文件本身的编码)和contentType(HTTP响应头的Content-Type),且两者保持一致(推荐使用UTF-8编码,兼容性最强)。示例如下:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
同时,在HTML的<head>
标签内添加<meta>
标签,强制浏览器以UTF-8解析页面:
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
注意:保存JSP文件时,需通过文本编辑器(如VS Code、Notepad++)确认编码为UTF-8(无BOM格式)。
Tomcat默认使用ISO-8859-1编码处理URL参数(如GET请求的参数),需修改server.xml
文件中的<Connector>
标签,添加URIEncoding="UTF-8"
属性,确保URL参数以UTF-8解码。路径通常为/usr/local/tomcat/conf/server.xml
(具体路径取决于Tomcat安装位置),修改示例如下:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
URIEncoding="UTF-8" />
修改后需重启Tomcat生效。
在Servlet或JSP中,通过response.setCharacterEncoding()
和response.setContentType()
方法,强制设置HTTP响应的字符编码为UTF-8。示例如下:
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset=UTF-8");
优化建议:使用**过滤器(Filter)**统一处理所有请求的编码,避免在每个页面重复编写代码。示例如下:
CharacterEncodingFilter.java
:import javax.servlet.*;
import java.io.IOException;
public class CharacterEncodingFilter implements Filter {
private String encoding = "UTF-8";
@Override
public void init(FilterConfig filterConfig) {
String encodingParam = filterConfig.getInitParameter("encoding");
if (encodingParam != null) {
encoding = encodingParam;
}
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
request.setCharacterEncoding(encoding);
response.setCharacterEncoding(encoding);
chain.doFilter(request, response);
}
@Override
public void destroy() {}
}
web.xml
中配置过滤器:<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>com.example.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
这样,所有请求都会经过过滤器,自动设置编码。CentOS的默认编码(如LANG
环境变量)若为非UTF-8(如zh_CN.GBK
),可能导致系统级字符处理乱码。通过以下命令检查当前编码:
echo $LANG
若结果不是UTF-8
(如zh_CN.UTF-8
),需修改/etc/locale.conf
文件(需root权限),添加或修改以下内容:
LANG="zh_CN.UTF-8"
LC_ALL="zh_CN.UTF-8"
保存后,执行source /etc/locale.conf
使配置生效,并通过locale
命令验证编码是否正确。
若JSP页面从数据库读取或写入中文数据时出现乱码,需确保数据库连接使用UTF-8编码。以MySQL为例,在JDBC连接URL中添加characterEncoding=UTF-8
参数:
String url = "jdbc:mysql://localhost:3306/yourdb?useUnicode=true&characterEncoding=UTF-8";
注意:还需确认数据库(如MySQL的utf8mb4
字符集)和表的字符集设置为UTF-8,避免数据存储时编码不一致。
通过以上步骤逐一排查,可解决CentOS环境下JSP页面显示乱码的问题。核心逻辑是确保字符编码在JSP文件、服务器、浏览器、数据库等所有环节一致,优先推荐使用UTF-8编码(支持所有语言字符,避免后续扩展问题)。