jsp中文字符乱码问题,一种是POST提交出现的字符乱码问题,一种是GET提交出现的字符乱码问题,对于前者解决起来很简单,对于后者解决起来稍微有点复杂。
POST提交出现的字符乱码问题:在jsp页面设置UTF-8编码
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
然后在后台处理时,只需要再次设置一下编码
request.setCharacterEncoding("utf-8");
就能将中文正确存入数据库。
GET提交出现的字符乱码问题:同样需要在jsp页面设置UTF-8编码,但还要在javascript中对url进行二次编码
url=encodeURI(encodeURI(url));
然后在后台处理时,利用URLDecoder类中的decode方面进行解码
request.setCharacterEncoding("utf-8");
String goodno = request.getParameter("goodno");
String goodname = request.getParameter("goodname");
//若在get方法提交中传递中文数据,应在客户端对url进行二次编码;而服务端在
//获取数据后,对中文数据进行解码即可
if(null!=goodname&&!"".equals(goodname)){
goodname=URLDecoder.decode(goodname, "utf-8");
}
当然,还可以利用过滤器来解决中文字符的乱码问题。以下,只解决了POST提交问题。
package liaoliao.util;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
/**
* 中文过滤器0.1
* @author Administrator
*
*/
public class EncodeFilter implements Filter {
private String encode;
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
//解决post中文问题
request.setCharacterEncoding(encode);
//将请求中过滤器中交出
chain.doFilter(request, response);
}
public void init(FilterConfig config) throws ServletException {
encode = config.getInitParameter("encode");
if(encode==null||"".equals(encode)){
encode = "UTF-8";
}
}
}
web.xml配置文件中需要对过滤器进行配置
<filter>
<filter-name>EncodeFilter</filter-name>
<filter-class>util.EncodeFilter</filter-class>
<init-param>
<param-name>encode</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>EncodeFilter</filter-name>
<url-pattern>/*</url-pattern>
<!-- 如果不配置dispatcher,默认情况下只对请求过滤
servlet-name:配置servlet名,servlet-name和url-pattern只会出现一个
-->
<dispatcher>REQUEST</dispatcher>
<!--
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
<dispatcher>ERROR</dispatcher>
-->
</filter-mapping>
以下可以解决POST和GET提交中文乱码问题1.
package util;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
/**
* 编码过滤器
* @author Administrator
*
*/
public class EncodeFilter2 implements Filter {
private String encode;
class Request extends HttpServletRequestWrapper{
public Request(HttpServletRequest request) {
super(request);
}
private String change(String value){
String str = null;
try {
str = new String(value.getBytes("ISO-8859-1"),encode);
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return str;
}
private String[] changeStrArgs(String[] values){
String[] targerStr = new String[values.length];
for(int i=0;i<values.length;i++){
try {
targerStr[i] = new String(values[i].getBytes("ISO-8859-1"),encode);
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return targerStr;
}
@Override
public String getParameter(String name) {
return change(super.getParameter(name));
}
@Override
public String[] getParameterValues(String name) {
// TODO Auto-generated method stub
return changeStrArgs(super.getParameterValues(name));
}
}
public void destroy() {
// TODO Auto-generated method stub
}
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {
//强制转型为HttpServletRequest
HttpServletRequest request = (HttpServletRequest) req;
//得到请求方法
String method = request.getMethod();
if("POST".equals(method)){
//处理post提交的编码问题
request.setCharacterEncoding(encode);
}else if("GET".equals(method)){
req = new Request(request);
}
//将请求交出
chain.doFilter(req, resp);
}
/**
* 初始化方法
*/
public void init(FilterConfig config) throws ServletException {
encode = config.getInitParameter("encode");
if(encode==null || "".equals(encode)){
encode = "UTF-8";
}
}
}
以下可以解决POST和GET提交中文乱码问题2.
package org.hntest.myaddrbook.util;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
public class SetCharacterEncodingFilter extends HttpServlet implements Filter {
protected String encoding = null;
protected FilterConfig filterConfig = null;
/**
*
* 对 HttpServletRequestWrapper 进行扩充, 不影响原来的功能并能提供所有的 HttpServletRequest
* 接口中的功能. 它可以统一的对 Tomcat 默认设置下的中文问题进行解决而只需要用新的 Request 对象替换页面中的
* request 对象即可.
*/
// *********************************************************************************
class Request extends HttpServletRequestWrapper {
public Request(HttpServletRequest request) {
super(request);
}
/**
* 转换由表单读取的数据的内码.
* 从 ISO 字符转到 utf-8(或gbk).
*/
public String toChi(String input) {
try {
byte[] bytes = input.getBytes("ISO-8859-1");
return new String(bytes, encoding);
}
catch (Exception ex) {
}
return null;
}
/**
* Return the HttpServletRequest holded by this object.
*/
private HttpServletRequest getHttpServletRequest()
{
return (HttpServletRequest)super.getRequest();
}
/**
* 读取参数 -- 修正了中文问题.
*/
public String getParameter(String name)
{
return toChi(getHttpServletRequest().getParameter(name));
}
/**
* 读取参数列表 - 修正了中文问题.
*/
public String[] getParameterValues(String name)
{
String values[] = getHttpServletRequest().getParameterValues(name);
if (values != null) {
for (int i = 0; i < values.length; i++) {
values[i] = toChi(values[i]);
}
}
return values;
}
}
//*********************************************************************************
public void destroy() {
this.encoding = null;
this.filterConfig = null;
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain)
throws IOException, ServletException {
System.out.println("encoding filter");
HttpServletRequest httpreq = (HttpServletRequest)request;
if(httpreq.getMethod().equals("POST")) {
request.setCharacterEncoding(encoding);
} else {
request = new Request(httpreq);
}
// Pass control on to the next filter
chain.doFilter(request, response);
}
/**
* Place this filter into service.
*
* @param filterConfig The filter configuration object
*/
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
this.encoding = filterConfig.getInitParameter("encoding");
if(encoding==null || "".equals(encoding)){
encoding = "UTF-8";
}
}
}
对应的配置文件
<filter>
<filter-name>SetCharacterEncodingFilter</filter-name>
<filter-class>org.hntest.myaddrbook.util.SetCharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>SetCharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>