在網(wǎng)上搜了很多資料都沒有搞定,一般都有以下幾種說法:

方法1:在后臺中先獲得字符串的iso-8859-1編碼形式數(shù)組,再使用此數(shù)組實例一個UTF-8編碼形式String類型字符串.

頁面提交的url:

leavesp?work=部門主管審批

 

后臺處理:

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

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

 

方法2:在頁面?zhèn)鬟f過來時先通過JavaScriptURL編碼,再到后臺進行解碼:

頁面部分:

<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);

 

嘗試過兩種方法后好像都不行,在后臺獲取到的字符還是會亂碼.試完之后真想哭.*o*

使用第一種方法后發(fā)現(xiàn):

在請求(request)中獲得的字符串是這樣的: ²¿ÃÅÖ÷¹ÜÉóÅú

使用new String(inStr.getBytes("iso-8859-1"),"UTF-8");處理后字符成了: ??????????

 

沒法,只能再試第二種方法了,使用后發(fā)現(xiàn):

在頁面中使用encodeURI(url),字符串是這樣的:

%E9%83%A8%E9%97%A8%E4%B8%BB%E7%AE%A1%E5%AE%A1%E6%89%B9

好像有希望了!!!!

應該只要在后臺再來decoder一下就行了吧,偶是這樣想的,也是這樣做的:

在后臺中:

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

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

在請求中獲得的字符串是這樣的: é?¨é—¨ä¸»ç®¡å®¡æ?¹

decoder處理后得出的字符串為: é?¨é—¨ä¸»ç®¡å®¡æ?¹

 

這時候真想哭啊!!%#$%@@!@$$##

 

革命尚未成功,還需努力!!!

 

從第二種方法中發(fā)現(xiàn):

在請求中獲得的字符串已經(jīng)亂碼了,decoder處不處理值都是一個樣!!

明明我在頁面?zhèn)鬟^來的值是已經(jīng)encode過了的字符,而后來取出來卻….,這是為什么呢?

 

難倒是頁面編碼設置得有問題?

看了一下頁面編碼是: pageEncoding="UTF-8"

改了!改成: pageEncoding="iso-8859-1"試試.

瀏覽頁面上,發(fā)現(xiàn)頁面上的中文變成了很多éæ?之類的字符,不管了,再試下,還是一樣的結果.濤聲依舊!

 

忽然想到應該是在獲得字符串之前,也就是在request. getParameter("work ");這之前的某個地方已經(jīng)將URL進行了decoder,并且將獲得的字符用Iso-8859-1的編碼方式存儲過了.

 

所以在request中會得到這些類似于éæ?之類的字符,這種字符應該就是中文的iso-8859-1的形式!!

 

有辦法了,既然已經(jīng)獲得了iso-8859-1編碼形式的中文,那就只要再使用第一種方法(先獲得字符串的iso-8859-1數(shù)組,再將它實例成UTF-8的字符串)來進行處理不就OK!

 

試過之后果然OK!!! 

 

處理中文亂碼代碼實現(xiàn)部分:

 

jsp頁面:

<%@ page language="java" pageEncoding="UTF-8"%>

 

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

  <head>

    <script type="text/javascript">

        //開啟網(wǎng)頁對話腳本

        function openDialog(url,width,height)

        {

           var property="status:no;center:yes;resizable:yes;scroll:yes;dialogWidth:"+width+"px;dialogHeight:"+height+"px;";  

           var ret=window.showModalDialog(url,'modalDialogwin',property);

                 

           if (ret == null || ret == "")

           {return false;}

           return true;

        }

       

        //查看待辦工作腳本

        function showork(url)

        { 

           //url地址進行編碼                  

           url=encodeURI(url);

           //alert(url);

           //調(diào)用openDialog方法開啟網(wǎng)頁對話框

           openDialog(url,900,500)

        }

    </script> 

    <title>待辦工作查看</title>

 

  </head>

   

  <body>

  <!-- 部分代碼略 -->

    <table border="1" align="center">

        <tr>

           <td>

<a href="#" onclick="javascript:showork('leavesp?work=部門主管審批')">查看待辦工作</a>

</td>   

        </tr>            

    </table>  

  </body>

</html>

 

頁面部分就一個超連接,用來開啟一個網(wǎng)頁對話框,只是開啟的這個對話框中請求的不是一個物理的頁面,而是請求的一個servletleavesp),而且url中帶有中文參數(shù)值(?work=部門主管審批)。

 

為了處理中文亂碼部分能夠在整個WEB系統(tǒng)中都能夠使用到,所以將中文亂碼處理寫成了一個Filter(過濾器),并在web.xml中配置所有的請求都將經(jīng)過這個Filter進行過濾。Filter部分的代碼如下:

文件名:ProFilter.java

package com.util.filters;

 

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;

 

public class ProFilter 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,到這的時候就已經(jīng)自動decode過了

           //將字符串轉為UTF-8編碼形式

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

       }

       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),根據(jù)不同請求方式進行不同處理

       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

       {

           //取出客戶提交的參數(shù)集

           Enumeration<String> paramNames = request.getParameterNames();

           //遍歷參數(shù)集取出每個參數(shù)的名稱及值

           while(paramNames.hasMoreElements())

           {

              String name = paramNames.nextElement();//取出參數(shù)名稱

              String values[] = request.getParameterValues(name);//根據(jù)參數(shù)名稱取出其值

              //如果參數(shù)值集不為空

              if(values != null)

              {

                  //如果參數(shù)值集中只有一個值

                  if(values.length == 1)

                  {

                     try

                     {

                         //調(diào)用toUTF(values[0])函數(shù),(values[0]即第一個參數(shù)值)方法轉換參數(shù)值的字元編碼                        

                         String vlustr=toUTF(values[0]);

                         //并將該值以屬性的形式藏在request

                         request.setAttribute(name, vlustr);

                     } catch (UnsupportedEncodingException e)

                     {

                         e.printStackTrace();

                     }

                  }

                  //如果參數(shù)值集中有多個值

                  else

                  {

                     //遍歷參數(shù)值集

                     for(int i=0;i<values.length;i++)

                     {

                         try

                         {

                            //回圈依次將每個值調(diào)用toUTF(values[i])方法轉換參數(shù)值的字元編碼

                            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"); 

 

       //繼續(xù)執(zhí)行下一個filter,無一下個filter則執(zhí)行請求

       chain.doFilter(request, response);

    }

   

    /**

     * 銷毀方法

     */

    public void destroy()

    {

      

    }

}

 

過濾器部分,可用來處理頁面提交的postget方法產(chǎn)生的中文亂碼問題。

Post方式提交的數(shù)據(jù)(form表單中提交的數(shù)據(jù))只需要進行請求字符編碼設置request.setCharacterEncoding("UTF-8");和響應設置response.setContentType("text/html;charset=UTF-8");設置就可以了。

Get方式提交的數(shù)據(jù)會包含在url中,(如:leavesp?work=部門主管審批),則需要取出參數(shù)名:Enumeration<String> paramNames = request.getParameterNames();(如:work)和取出參數(shù)值:String values[] = request.getParameterValues(name);(如:部門主管審批),然后再將參數(shù)值進行編碼轉換:outStr = new String(inStr.getBytes("iso-8859-1"),"UTF-8");

 

過濾器寫好這后就需要到web.xml<web-app></web-app>之間進行配置了,web.xml中配置如下:

<!-- 配置過濾器 -->

    <filter>

       <description>處理中文亂碼過濾器</description>

       <filter-name>ProFilter</filter-name>

       <filter-class> com.util.filters.ProFilter</filter-class>

    </filter>

    <filter-mapping>

       <filter-name>ProFilter</filter-name>

       <url-pattern>*</url-pattern><!-- 過濾所有請求,注:tomcat5請用/* -->

    </filter-mapping>

 

這樣配置之后只要頁面有任何請求都會通過ProFilter進行中文處理了,就不會再發(fā)生中文亂碼問題了。

 

那一串通過get傳遞過來的中文處理過程如下:

1.       jsp頁面的JavaScript里面進行編碼處理:

url=encodeURI(‘leavesp?work=部門主管審批’)

編碼后結果:url=leavesp?work=%E9%83%A8%E9%97%A8%E4%B8%BB%E7%AE%A1%E5%AE%A1%E6%89%B9

2.       因為在web.xml過濾器配置為<url-pattern>*</url-pattern>所以所有請求將會通過過濾器進行處理,此過濾器處理過程如下:

2.1獲得參數(shù)名集合:

Enumeration<String> paramNames = request.getParameterNames();

String name = paramNames.nextElement();

2.1結果中有name=’work’;一值。

 

2.2通過參數(shù)名獲得參數(shù)值:

String values[] = request.getParameterValues(name);

work的值只有一個所以2.2的結果為:values[0]=’ é?¨é—¨ä¸»ç®¡å®¡æ?¹’;(此處得到的是字符串:“部門主管審批”的iso-8859-1編碼格式字符)

 

2.3獲得字符串的UTF-8編碼格式字符:

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

2.3中獲得的結果為outStr=“部門主管審批”.

至此中文已經(jīng)正常了。

 

不過過濾器還沒處理結束,還得將參數(shù)名對應的值(已經(jīng)處理的值)再重新藏到請求中去。

2.4將參數(shù)名對應結果藏入請求中:

request.setAttribute(name, outStr);

通過2.4處理后,請求中的work的值就變成了:部門主管審批

 

2.5 繼續(xù)執(zhí)行下一個filter,無一下個filter則執(zhí)行請求

chain.doFilter(request, response);

3.       通過過濾器之后,就可以進入請求中對應leavespservlet了(servlet就不做說明了),此時在servlet中通過String work=request.getParameter(“work”);就可以獲得url中傳遞過來的中文參數(shù)值了,結果為work=” 部門主管審批



開心過好每一天。。。。。