<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Put on steam!!

      BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
      4 Posts :: 0 Stories :: 20 Comments :: 0 Trackbacks

    作者:肖文偉

     

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

    方法1:在后臺中先獲得字符串的iso-8859-1編碼形式數組,再使用此數組實例一個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ā)現:

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

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

     

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

    在頁面中使用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ā)現:

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

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

     

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

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

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

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

     

    忽然想到應該是在獲得字符串之前,也就是在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>

     

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

     

    為了處理中文亂碼部分能夠在整個WEB系統(tǒng)中都能夠使用到,所以將中文亂碼處理寫成了一個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"); 

     

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

           chain.doFilter(request, response);

        }

       

        /**

         * 銷毀方法

         */

        public void destroy()

        {

          

        }

    }

     

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

    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進行中文處理了,就不會再發(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獲得參數名集合:

    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 繼續(xù)執(zhí)行下一個filter,無一下個filter則執(zhí)行請求

    chain.doFilter(request, response);

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

     

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

     

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

    posted on 2009-05-26 15:07 zeus.xiao 閱讀(11305) 評論(4)  編輯  收藏

    Feedback

    # re: 處理URL傳遞中文亂碼問題[未登錄] 2009-05-26 16:06 bluesky
    以前我們也遇到這種問題,如果你用的是Tomcat的話,可以在定義端口號的的地方添加一個屬性:URIEncoding="GBK",你可以試試看  回復  更多評論
      

    # re: 處理URL傳遞中文亂碼問題 2009-05-27 18:51 一農
    @bluesky

    tomcat5 還是 5.5之后就存在這個問題。

    另外如果使用spring的話,可以使用其CharacterEncodingFilter,并建議將forceEncoding設為false,這樣可以接受客戶端不同的編碼。特別是使用ajax的時候。  回復  更多評論
      

    # re: 處理URL傳遞中文亂碼問題[未登錄] 2009-05-29 14:57 zeus.xiao
    回復:@一農
    在處理Ajax的中文亂碼問題的時候,我也出現了一些問題,但不知道怎樣來處理.您有好的方法解決嗎?
      回復  更多評論
      

    # re: 處理URL傳遞中文亂碼問題 2009-06-11 16:33 zeus.xiao
    @bluesky
    Hi bluesky:
    你的提供的方法我試了一下,在Struts中證實可以解決URI傳遞亂碼問題.
    我是這樣做的:
    1.設定Tomcat的URI編碼為"UTF-8":修改%tomcat%\conf\server.xml中的<Connector>在中間加入URIEncoding="UTF-8";
    2.先在頁面上encodeURI(url);
    3.后臺代碼中直接取出來的中文參數就已經OK了.

    不過這種方法用在servlet中行不通,在servlet中就必須對URI進行處理,Tomcat中有沒有加入URIEncoding都沒有差別.

    謝謝你的建議.^_^  回復  更多評論
      


    只有注冊用戶登錄后才能發(fā)表評論。


    網站導航:
     
    主站蜘蛛池模板: 久久精品亚洲中文字幕无码网站 | 日韩国产免费一区二区三区| 免费A级毛片无码A∨免费| 69精品免费视频| 成人一a毛片免费视频| 国产精品免费一级在线观看| 亚洲毛片不卡av在线播放一区| 亚洲国产精品福利片在线观看 | 亚洲自偷自偷图片| 久久久国产精品亚洲一区| 日本亚洲精品色婷婷在线影院| 337P日本欧洲亚洲大胆艺术图| 精品免费久久久久国产一区| 一级毛片在线观看免费| 国产精品成人免费一区二区| 国产一区二区三区无码免费| 在线亚洲午夜理论AV大片| 亚洲精品成人久久| 亚洲码欧美码一区二区三区| 一级毛片在线免费播放| 97视频免费观看2区| 日韩午夜免费视频| 久久精品国产精品亚洲精品| avtt天堂网手机版亚洲| 免费一级毛片在线播放放视频| 久久精品一区二区免费看| 成年大片免费视频| 亚洲熟妇无码乱子AV电影| 亚洲人成在线免费观看| 黄色三级三级三级免费看| 免费无遮挡无码永久视频| 成人免费视频国产| 亚洲成人在线网站| 噜噜综合亚洲AV中文无码| a在线观看免费网址大全| 成人免费无码大片a毛片| 亚洲日韩aⅴ在线视频| 亚洲狠狠婷婷综合久久| 精品视频一区二区三区免费| 人禽杂交18禁网站免费| 久久精品国产亚洲网站|