zoukankan      html  css  js  c++  java
  • 页面乱码

    在网上搜了很多资料都没有搞定 , 一般都有以下几种说法 :

    方法 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: 在页面传递过来时先通过 JavaScript 将 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);

    尝试过两种方法后好像都不行 , 在后台获取到的字符还是会乱码 . 试完之后真想哭 .*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.        在 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 继续执行下一个 filter, 无一下个 filter 则执行请求

    chain.doFilter(request, response);

    3.        通过过滤器之后,就可以进入请求中对应 leavesp 的 servlet 了( servlet 就不做说明了),此时在 servlet 中通过 String work=request.getParameter(“work”); 就可以获得 url 中传递过来的中文参数值了,结果为 work=” 部门主管审批 ” 。

  • 相关阅读:
    jquery城市选择案例
    jquery点击回到页面顶部方法
    jquery动态创建表格
    myeclipse、eclipse中项目复制后(可能无法访问)注意事项 .
    Myeclipse如何整合tomcat
    Java学习路线图
    ftp
    用javascript实现简体和繁体字间的转换
    FTP远程命令集
    JDBC-ODBC桥乱码问题解决方案
  • 原文地址:https://www.cnblogs.com/aiwoqu/p/4195665.html
Copyright © 2011-2022 走看看