我做搜索的时候 用户输入的参数是 中文 那么就要编码了、
现在 比如 用输入的 "劳"
我先用js来做一些判断如:
<script type="text/javascript">
                function aa(){
                    var key= document.getElementById("key").value;
                    key = encodeURI(key); //编码一次
                    key=encodeURI(key); //编码两次
                if(key.replace(/\s/ig,'')==""){
                alert("请输入关键字");
                }else{
                window.location.href="infoAction!shousuo.dhtml?key="+key;
                }
                }
               
   </script>
<form>
<input type="text" class="text2" name="key"  id="key"/>
<img type="buttion" class="btn" onclick="aa()" value="搜索"> 
</form>
经过两次编码 "劳"字变成:%25E5%258A%25B3 
被传入到action中,然后action中转码:
String key1=super.getParameter("key");
String  key= java.net.URLDecoder.decode(key1,"utf-8");//转码
request.setAttribute("key", key);//设置到作用域 传入到下一页面我测试过了:这样子得到的 是对的 是"劳"字
关键的在下面:
我搜索完了后 到一个呈现页面 分页显示 搜索出来的信息
那么在做分页的时候,假如有下一页,那么这个关键字也必须传给action 如:
<a href="infoAction!shousuo.dhtml?pageNo=${requestScope.pageNo+1 &key=${pageScope.key2}" >下一页</a>
这里的key=${pageScope.key}自然就改是 "劳"字编码后的 应该是:%25E5%258A%25B3
为了达到这个目的我在jsp页面使用如下java代码:
<%
  String key1=(String)request.getAttribute("key");
  String key2=java.net.URLEncoder.encode(key1);//编码一次; 
  pageContext.setAttribute("key2",key2);
 %>
我用getAttribute("key");参数得到是"劳"字但是不管我下面用java.net.URLEncoder.encode(key1);编码一次得到:%C0%CD于是我编码两次又得到:%25C0%25CD。始终都得不到:%25E5%258A%25B3 。
这是问题1下面是问题2
后来也不知道为什么就改为如下:
<%
  String key1=(String)request.getParameter("key");
  String key2=java.net.URLEncoder.encode(key1);//编码一次; 
  pageContext.setAttribute("key2",key2);
 %>
这样子我得到的key1既然不是劳而是:%E5%8A%B3
这样子编码一次 也就是key2就变成了:%25E5%258A%25B3 
这样子高兴了一下,认为得到了自己想要的结果。结果我用火狐一试:
我点击下一页:结果&key=${pageScope.key2} 这里的key却是:%E5%8A%B3。而不是:%25E5%258A%25B3 
我换用ie 点击下一页:结果&key=${pageScope.key2}   这里的key又是:%25E5%258A%25B3 看了半天 实在没有弄明白 ,对于问题1和问题2
请教高手解答。

解决方案 »

  1.   

    encodeURI和URLEncoder是不一样的吧。
      

  2.   

    encode(String s)    已过时。 结果字符串可能因平台默认编码不同而不同。因此,改用 encode(String,String) 方法指定编码;
    decode(String s)    已过时。 结果字符串可能因平台默认编码不同而不同。因此,改用 decode(String,String) 方法指定编码;
    encode
    public static String encode(String s,
                                String enc)
                         throws UnsupportedEncodingException使用指定的编码机制将字符串转换为 application/x-www-form-urlencoded 格式。该方法使用提供的编码机制获取不安全字符的字节。 
    注:World Wide Web Consortium Recommendation 声明应使用 UTF-8。如果不使用该编码,可能造成不兼容性。 
    参数:
    s - 要转换的 String。
    enc - 所支持的字符编码名称。 
    返回:
    已转换的 String。 
    抛出: 
    UnsupportedEncodingException - 如果不支持指定的编码
    ............
      

  3.   

    第一个问题:应该是你的2次编码的所用的字符集不同%25 就是'%' 但是%E5%8A%B3和%C0%CD如果都是 劳 ,肯定就是2种不同的字符集解析出来的结果,修改的具体方法见2楼第二个问题:不知道是不是IE有自动编码的能力…………抱歉我也不知道
      

  4.   

    在ACTION中得出 劳 之后将劳setAttribute不要编码一次之后再setAttribute,然后在下一页按钮的参数中将搜索词URLEncoder(getAttribute,"UTF-8")两次即可啊
      

  5.   

    比如先用base64编码,然后在转回来。
    这个肯定可以。
      

  6.   

    好像没必要这么复杂吧?你把页面设置成utf-8,数据库也设置成utf-8。
    我还真没见过传个值都这么转来转去的,看着都疯了
      

  7.   

    其实可以这样,把编码工作交给后台,前台只是判断逻辑
    <script type="text/javascript">
      function aa(){
      var key= document.getElementById("key").value;
       if(key.length==0){
      alert("请输入关键字");
      }else{
      window.location.href="infoAction!shousuo.dhtml?key="+key;
      }
      }
        
      </script>
    后台这样
    request.setCharacterEncoding("utf-8");
    String key=request.getParameter("key");  

    if(StringUtils.isNotBlank(key))
    key= new String(key.getBytes("ISO-8859-1"),"UTF-8");
    这样得到的是中文的 不会乱码
    你需要翻页所以存到request.setAttribute("key",key)
    需要翻页的页面直接取值
    <a href="infoAction!shousuo.dhtml?pageNo=${requestScope.pageNo+1 &key=${key}" >下一页</a>
    这样传到后台在处理  用上面的方法 
      

  8.   


        其实只要编码保持一致肯定就不会出现乱码问题。
         首先数据库编码比如设置成UTF-8
         工程编码设置成UTF-8。
          在开发工具中设置jsp的编码格式为UTF-8。
         这样基本就不会有什么问题。
         在可以添加个字符的过滤器。