日期:2014-05-20  浏览次数:20695 次

和大家讨论一个编码的问题 求解?
我做搜索的时候 用户输入的参数是 中文 那么就要编码了、
现在 比如 用输入的 "劳"
我先用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
请教高手解答。






------解决方案--------------------
encodeURI和URLEncoder是不一样的吧。
------解决方案--------------------
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 - 如果不支持指定的编码
............
------解决方案--------------------
第一个问题:应该是你的2次编码的所用的字符集不同%25 就是'%' 但是%E5%8A%B3和%C0%CD如果都是 劳 ,肯定就是2种不同的字符集解析出来的结果,修改的具体方法见2楼

第二个问题:不知道是不是IE有自动编码的能力…………抱歉我也不知道
------解决方案--------------------
探讨

第一个问题:应该是你的2次编码的所用的字符集不同%25 就是'%' 但是%E5%8A%B3和%C0%CD如果都是 劳 ,肯定就是2种不同的字符集解析出来的结果,修改的具体方法见2楼