處理URL傳遞中文亂碼問題

在網上搜了不少資料都沒有搞定 , 通常都有如下幾種說法 :javascript

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

頁面提交的 url 爲 :java

leavesp?work= 部門主管審批web

 

後臺處理 :數組

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

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

 

方法 2: 在頁面傳遞過來時先經過 JavaScript 將 URL 編碼 , 再到後臺進行解碼 :jsp

頁面部分 :函數

<script type="text/javascript">post

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*

使用第一種方法後發現 :

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

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

 

無法 , 只能再試第二種方法了 , 使用後發現 :

在頁面中使用 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 處理後得出的字符串爲 : é ƒ¨é—¨ä¸»ç®¡å®¡æ‰¹

 

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

 

革命還沒有成功 , 還需努力 !!!

 

從第二種方法中發現 :

在請求中得到的字符串已經亂碼了 , 用 decoder 處不處理值都是一個樣 !!

明明我在頁面傳過來的值是已經 encode 過了的字符 , 然後來取出來卻 …., 這是爲何呢 ?

 

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

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

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

瀏覽頁面上 , 發現頁面上的中文變成了不少é æ‰ 之類的字符 , 無論了 , 再試下 , 仍是同樣的結果 . 濤聲依舊 !

 

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

 

因此在 request 中會獲得這些相似於é æ‰ 之類的字符 , 這種字符應該就是中文的 iso-8859-1 的形式 !!

 

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

 

試過以後果真 OK!!!  

 

處理中文亂碼代碼實現部分:

 

jsp 頁面:

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

 

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

< html >

  < head >

    < script type = "text/javascript" >

        // 開啓網頁對話腳本

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

           // 調用 openDialog 方法開啓網頁對話框

           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 >

 

頁面部分就一個超鏈接,用來開啓一個網頁對話框,只是開啓的這個對話框中請求的不是一個物理的頁面,而是請求的一個 servlet ( leavesp ),並且 url 中帶有中文參數值( ?work= 部門主管審批 )。

 

爲了處理中文亂碼部分可以在整個 WEB 系統中都可以使用到,因此將中文亂碼處理寫成了一個 Filter( 過濾器 ) ,並在 web.xml 中配置全部的請求都將通過這個 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 了 , 到這的時候就已經自動 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), 根據不一樣請求方式進行不一樣處理

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

    {

      

    }

}

 

過濾器部分,可用來處理頁面提交的 post 和 get 方法產生的中文亂碼問題。

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

Get 方式提交的數據會包含在 url 中,(如: leavesp?work= 部門主管審批),則須要取出參數名: Enumeration<String> paramNames = request.getParameterNames(); (如: work )和取出參數值: String values[] = request.getParameterValues(name);( 如:部門主管審批 ), 而後再將參數值進行編碼轉換: 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 進行中文處理了,就不會再發生中文亂碼問題了。

 

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

  1. 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

  1. 2.        由於在 web.xml 過濾器配置爲 < url-pattern > * </ url-pattern > 因此全部請求將會經過過濾器進行處理,此過濾器處理過程以下:

2.1 得到參數名集合:

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

String name = paramNames.nextElement();

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

 

2.2 經過參數名得到參數值:

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= 「部門主管審批」 .

至此中文已經正常了。

 

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

2.4 將參數名對應結果藏入請求中:

request.setAttribute(name, outStr );

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

 

2.5 繼續執行下一個 filter, 無一下個 filter 則執行請求

chain.doFilter(request, response);

  1. 3.        經過過濾器以後,就能夠進入請求中對應 leavesp 的 servlet 了( servlet 就不作說明了),此時在 servlet 中經過 String work=request.getParameter(「work」); 就能夠得到 url 中傳遞過來的中文參數值了,結果爲 work=」 部門主管審批 」 。

 

看到這裏,你應該也已經會處理中文亂碼問題了。趕忙試試!! ^_^

 

這是我我的處理中文亂碼的經驗,我將它拿來分享與各位,若是中間有寫得不對的地方還請各位幫忙指正。謝謝

相關文章
相關標籤/搜索