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

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

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

    Put on steam!!

      BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
      4 Posts :: 0 Stories :: 20 Comments :: 0 Trackbacks

    作者:肖文偉

     

    在網(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

    好像有希望了!!!!

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

    在后臺中:

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

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

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

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

     

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

     

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

     

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

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

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

     

    難倒是頁面編碼設(shè)置得有問題?

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

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

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

     

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

     

    所以在request中會得到這些類似于éæ?之類的字符,這種字符應(yīng)該就是中文的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轉(zhuǎn)為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過了

               //將字符串轉(zhuǎn)為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請求與響應(yīng)對象轉(zhuǎn)換成HttpServlet請求與響應(yīng)對象

           HttpServletRequest request=(HttpServletRequest)svlrequest;

           HttpServletResponse response=(HttpServletResponse)svlresponse;

          

           //獲得請求的方式(1.post or 2.get),根據(jù)不同請求方式進行不同處理

           String method = request.getMethod();

           //1.post方式提交的請求,直接設(shè)置編碼為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ù)值)方法轉(zhuǎn)換參數(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])方法轉(zhuǎn)換參數(shù)值的字元編碼

                                String vlustr=toUTF(values[i]);

                                values[i] = vlustr;

                             } catch (UnsupportedEncodingException e)

                             {

                                e.printStackTrace();

                             }

                         }

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

                         request.setAttribute(name, values);

                      }

                  }

               }

     

           }

            //設(shè)置響應(yīng)方式和支持中文的字元集

           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ù))只需要進行請求字符編碼設(shè)置request.setCharacterEncoding("UTF-8");和響應(yīng)設(shè)置response.setContentType("text/html;charset=UTF-8");設(shè)置就可以了。

    Get方式提交的數(shù)據(jù)會包含在url中,(如:leavesp?work=部門主管審批),則需要取出參數(shù)名:Enumeration<String> paramNames = request.getParameterNames();(如:work)和取出參數(shù)值:String values[] = request.getParameterValues(name);(如:部門主管審批),然后再將參數(shù)值進行編碼轉(zhuǎn)換: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=部門主管審批’)

    編碼后結(jié)果: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結(jié)果中有name=’work’;一值。

     

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

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

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

     

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

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

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

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

     

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

    2.4將參數(shù)名對應(yīng)結(jié)果藏入請求中:

    request.setAttribute(name, outStr);

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

     

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

    chain.doFilter(request, response);

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

     

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

     

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

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

    Feedback

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

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

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

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

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

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

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

    謝謝你的建議.^_^  回復(fù)  更多評論
      


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


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 亚洲人AV永久一区二区三区久久| 亚洲AV日韩AV高潮无码专区| 亚洲AV无码乱码在线观看代蜜桃| 视频免费1区二区三区| 国产一卡2卡3卡4卡无卡免费视频 国产一卡二卡3卡四卡免费 | 亚洲av乱码一区二区三区按摩| 最近2019年免费中文字幕高清 | 亚洲色成人中文字幕网站| 亚洲欧美乱色情图片| 中文字幕在线免费| 久久精品夜色噜噜亚洲A∨| 亚洲AV永久无码天堂影院| 久视频精品免费观看99| 亚洲五月综合缴情在线观看| 国产精品亚洲五月天高清| 免费AA片少妇人AA片直播| 人人狠狠综合久久亚洲88| 又粗又长又爽又长黄免费视频 | aa在线免费观看| 免费在线黄色网址| 亚洲日本va一区二区三区| 日本免费xxxx| 亚洲综合精品香蕉久久网97| 国产三级在线免费| 国产精品亚洲mnbav网站| mm1313亚洲国产精品无码试看| 噼里啪啦电影在线观看免费高清 | 女人18一级毛片免费观看| 亚洲午夜精品一区二区公牛电影院| 在线观看免费无码专区| 亚洲性猛交XXXX| 国产免费AV片在线观看播放| 免费a级毛片永久免费| 在线观看亚洲电影| 性做久久久久免费观看| 亚洲精品永久在线观看| 久久综合AV免费观看| 亚洲一区二区三区久久| 色播精品免费小视频| 亚洲精品福利网泷泽萝拉| 最近最新高清免费中文字幕|