JSP中文乱码问题

  • 内容
  • 相关

    是的,中文乱码问题在 JSP 中挺常见的,发生乱码的根本原因在于编码格式不一致,这包括页面请求和显示的编码格式、代码的编码格式、数据在文件和数据库中存储的编码格式等。

乱码解决方案:

统一编码格式

    统一编码格式包括代码、数据库和页面,所有地方都设置为统一的编码格式。常用的是“UTF-8”,当然,如果只是为了支持简体中文的正确显示,GB2312 也是不错的。

代码的编码格式:

    在使用 Tomcat 服务器时,可以通过设置 pageEncoding 参数:

<%@ page language="java" ContentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>

    Tomcat 会从 JSP 文件中读取这个参数(如果没有读到,就从第一行的 ContentType 中读取 charset)来作为文件读写的编码方式。如果没有读取到这个参数,会从 JSPConfig 中读取一个默认的 PageEncoding 参数,如果两个参数都没设置,系统会默认以 ISO-8859-1 的编码方式来读取原来的 JSP 文件。

    注意的是,这里如果使用 <%@ page language="java" pageEncoding="ISO-8859-1"%> 可能会出现一个错误:

1.png

    这是因为文件中含有 ISO-8859-1 无法识别的中文字符,只需将编码格式改一下即可:"UTF-8"。

    但是对于有些服务器,如 weblogic ,没有获得 pageEncoding 参数时,并不是从 charset 中获取编码格式,而是从另外的一些配置文件读取编码设置。例如 weblogic.xml 文件需加上下面的代码

<jsp-descriptor>
<jsp-param>
<param-name>complierSupports</param-name>
<param-value>true</param-value>
</jsp-param>
<jsp-param>
<param-name>encoding</param-name>
<param-value>UTF8</param-value>
</jsp-param>
</jsp-descriptor>

数据存储的编码格式:

    数据可以存储在文件或数据库中。例如 MySQL 数据库中文乱码问题,MySQL 默认字符集是 Latin-1,所以直接从 GB2312 编码的中文网页提交数据或者显示数据到中文页面时都会出现问题。解决方法:修 MySQL 的配置文件中默认编码方式:

[mysqld]
default-character-set=utf8

[client]
default-character-set=utf8
init_connect='SET NAMES utf8

页面请求和显示的编码格式

    直接指定 request response 内置对象的编码方式:

request.setCharacterEncoding("UTF-8");

    对于表单 URL 传参都采用设定的编码方式读取。

response.setCharacterEncoding("UTF-8");

    对客户端的输出以指定的编码方式进行。

示例:

login.jsp:

<%@ page language="java" pageEncoding="UTF-8"%>
<center>
	<form action="process.jsp" method="post">
		<p>登录</p>
		<p>用户名:<input type="text" name="uname">
		<p>&nbsp;密码:<input type="password" name="pwd">
		<p><input type="submit" value="提交">
		<input type="reset" value="重写">
	</form>
</center>

process.jsp:

<%@ page contentType="text/html; charset=utf-8"%>
<%
	request.setCharacterEncoding("UTF-8");
	String uname=request.getParameter("uname");
	String pwd = request.getParameter("pwd");
	if(uname.equals("") || pwd.equals(""))
		response.sendRedirect("login.jsp");
 %>
 <p>用户名:<%=uname %>
 <p>密   码:<%=pwd %>

    不加 request.setCharacterEncoding("UTF-8"); 的输出:

用户名:张三

密 码:123

    加上后输出:

用户名:张三

密 码:123

    还可以使用 getBytes() 来转换编码格式:

<%@ page contentType="text/html; charset=utf-8"%>
<%
	//request.setCharacterEncoding("UTF-8");
	String uname=request.getParameter("uname");
	uname = new String(uname.getBytes("iso-8859-1"),"UTF-8");
	String pwd = request.getParameter("pwd");
	
	if(uname.equals("") || pwd.equals(""))
	{
		response.sendRedirect("login.jsp");
	}
 %>
 <p>用户名:<%=uname %>
 <p>密   码:<%=pwd %>
    在表单数据提交有国际化需求时,setCharacterEncoding 就不是很合适了。可以使用 Servlet 过滤器。例如过滤器 setCharacterEncodingFilter.java:(源码

package samples.servlet;

import java.io.IOException;
import java.util.Locale;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class SetCharacterEncodingFilter implements Filter{
	FilterConfig filterConfig = null;
	boolean auto = true;	//是否启动自动选择
	public void init(FilterConfig filterConfig) throws ServletException{
		this.filterConfig = filterConfig;
		
		String value = filterConfig.getInitParameter("auto");//从配置文件读取参数
		if(value==null)
			this.auto = true;
		else	if(value.equalsIgnoreCase("true"))
			this.auto = true;
		else
			this.auto = false;
	}
	
	public void doFilter(ServletRequest request,ServletResponse response,
			FilterChain chain) throws IOException,ServletException{
		if(auto || (request.getCharacterEncoding()==null)){
			String encoding=selectEncoding(request);
			if(encoding!=null)
				request.setCharacterEncoding(encoding);	//设置编码
		}
		chain.doFilter(request, response);
	}
	//销毁过滤器
	public void destroy(){
		this.filterConfig = null;
	}
	protected String selectEncoding(ServletRequest request){
		Locale locale = request.getLocale();
		String encoding = request.getCharacterEncoding();//根据用户场景设置编码格式
		if("zh_CN".equals(locale.getDisplayName()))
			encoding = "GB2312";
		else	if("zh_TW".equals(locale.getDisplayName()))
			encoding = "BIG5";
		return encoding;
	}
}

web.xml 中设置:

<filter>
	<filter-name>Set Character Encoding</filter-name>
	<filter-class>samples.servlet.SetCharacterEncodingFilter</filter-class>
	<init-param>
		<param-name>auto</param-name>
		<param-value>true</param-value>
	</init-param>
</filter>
<filter-mapping>
	<filter-name>Set Character Encoding</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>

本文标签:

版权声明:若无特殊注明,本文皆为《尤尤》原创,转载请保留文章出处。

本文链接:JSP中文乱码问题 - https://www.yxfseo.cn/post-208.html

发表评论

电子邮件地址不会被公开。 必填项已用*标注