现在的位置: 首页 > 综合 > 正文

传统URL乱码(中文乱码问题)

2014年02月16日 ⁄ 综合 ⁄ 共 4874字 ⁄ 字号 评论关闭

在web开发中经常会用到url传参数,而且还会有很多传中文参数的,在这里我给大家总结讲解几种url乱码解决的方法:

建议:最好整个工程用一种统一的编码方式,如UTF-8(无论是在页面中还是在编码过滤器中)

在这里我介绍几种我工作中遇到的乱码问题:

 

方法一:具体问题具体分析

在后台中先获得字符串的iso-8859-1编码形式数组,再使用此数组实例一个UTF-8编码形式String类型字符串.

如页面提交的url为:

url=……leavesp?work=中文

后台处理:

String inStr=request.getParameter("work ");

String outStr = new String(inStr.getBytes("iso-8859-1"),"UTF-8");

 

方法二:url编码

<script type="text/javascript">

function dogetMethod(url)

{

        //url编码前: leavesp?work=部门主管审批

 

url=encodeURI(url);

 

//url编码后:

leavesp?work=%E9%83%A8%E9%97%A8%E4%B8%BB%E7%AE%A1%E5%AE%A1%E6%89%B9

 

window.open(uri,’’,’’);

}

</script>

后台部分:(解码)

String inStr= request.getParameter("work ");

String outStr=java.net.URLDecoder.decode(inStr);

 

方法三:写Filter统一处理

java类:

package com.yt.base;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Enumeration;
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.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * 实现url中文乱码的处理
 * @author He Rongbing
 * @注意:这里的filter通过页面url的parammer转发生成了request的attribute参数,
 * 在后台取的时候,就要从attribute中取得。这样就在requst的attribute中转发了一些同名的参数,
 * 在调用的时候,可能用到中文的地方,都要用request.getAttribue(parammeterName)得到参数;缺点是会导致网络传输量加大。
 */public class EncodingFilter implements Filter
{
 protected FilterConfig filterConfig;
 /**
  *
  * 初始化
  *
  */
 public void init(FilterConfig filterConfig) throws ServletException

 {
  this.filterConfig = filterConfig;
 }

 /**
  *
  * 将inStr转为UTF-8的编码形式
  *
  * @param inStr
  *            输入字符串
  *
  * @return UTF-8的编码形式的字符串
  *
  * @throws UnsupportedEncodingException
  *
  */

 private String toUTF(String inStr) throws UnsupportedEncodingException

 {
  String outStr = "";
  if (inStr != null)
  {
   // outStr=java.net.URLDecoder.decode(inStr);//不用decode了,到这的时候就已经自动decode过了
   // 将字符串转为UTF-8编码形式
   String encoding = filterConfig.getInitParameter("encoding");//这里用filter的初始化参数配置UTF-8
   outStr = new String(inStr.getBytes("iso-8859-1"), encoding);
    }
  return outStr;
 }
 /**
  *
  * 中文乱码过滤处理
  *
  */

 public void doFilter(ServletRequest svlrequest,
   ServletResponse svlresponse,
   FilterChain chain) throws IOException, ServletException

 {
  // 将Servlet请求与响应对象转换成HttpServlet请求与响应对象
  HttpServletRequest request = (HttpServletRequest) svlrequest;
  HttpServletResponse response = (HttpServletResponse) svlresponse;
  // 获得请求的方式(1.post or 2.get),根据不同请求方式进行不同处理
  String method = request.getMethod();
  // 1.以post方式提交的请求,直接设置编码为UTF-8
  if (method.equalsIgnoreCase("post"))
  {
   try
   {
    request.setCharacterEncoding("UTF-8");
   } catch (UnsupportedEncodingException e)

   {
    e.printStackTrace();
   }

  }
  // 2.以get方式提交的请求
  else
  {
   // 取出客户提交的参数集
   Enumeration<String> paramNames = request.getParameterNames();
   // 遍历参数集取出每个参数的名称及值
   while (paramNames.hasMoreElements())
   {
    String name = paramNames.nextElement();// 取出参数名称
    String values[] = request.getParameterValues(name);// 根据参数名称取出其值
    // 如果参数值集不为空
    if (values != null)
    {
     // 如果参数值集中只有一个值
     if (values.length == 1)
     {
      try
      {
       // 调用toUTF(values[0])函数,(values[0]即第一个参数值)方法转换参数值的字元编码
       String vlustr = toUTF(values[0]);
       // 并将该值以属性的形式藏在request
       request.setAttribute(name, vlustr);
      } catch (UnsupportedEncodingException e)
      {
       e.printStackTrace();
      }
     }
     // 如果参数值集中有多个值
     else
     {
      // 遍历参数值集
      for (int i = 0; i < values.length; i++)
      {
       try
       {
        // 回圈依次将每个值调用toUTF(values[i])方法转换参数值的字元编码
        String vlustr = toUTF(values[i]);
        values[i] = vlustr;
       } catch (UnsupportedEncodingException e)
       {
        e.printStackTrace();
       }
      }
      // 将该值以属性的形式藏在request
      request.setAttribute(name, values);
     }
    }
   }
  }
  // 设置响应方式和支持中文的字元集
  response.setContentType("text/html;charset=UTF-8");
  // 继续执行下一个filter,无一下个filter则执行请求
  chain.doFilter(request, response);
 }

 /**
  *
  * 销毁方法
  *
  */
 public void destroy()
 {
 }

}
web.xml:

<filter>
  <filter-name>encodingFilter</filter-name>
  <filter-class>
   com.yt.base.EncodingFilter
  </filter-class>
  <init-param>
   <param-name>encoding</param-name>
   <param-value>utf-8</param-value>
  </init-param>
 </filter>
 <filter-mapping>
  <filter-name>encodingFilter</filter-name>
  <url-pattern>/*</url-pattern>
 </filter-mapping>

 注意:这里的filter通过页面url的parammer转发生成了request的attribute参数,在后台取的时候,就要从attribute中取得。这样就在requst的attribute中转发了一些同名的参数,在调用的时候,可能用到中文的地方,都要用request.getAttribue(parammeterName)得到参数;缺点是会导致网络传输量加大。

 

方法四:改tomcat的server.xml

   如果有一些转码也转不过来的话,可是试试打开tomcat的server.xml,找到 <Connector acceptCount="100" connectionTimeout="20000" disableUploadTimeout="true" port="80" redirectPort="8443">   <connector port="80" face="Arial" redirectport="8443" disableuploadtimeout="true" connectiontimeout="20000"   acceptcount="100"></connector>

并在最后加上useBodyEncodingForURI="true" URIEncoding="UTF-8",如下<Connector acceptCount="100" connectionTimeout="20000" disableUploadTimeout="true" port="80" redirectPort="8443"  useBodyEncodingForURI="true" 

URIEncoding="UTF-8"> 

 

抱歉!评论已关闭.