escape()、encodeURI()、encodeURIComponent()都可以对字符进行编码转换.
如,escape('中文') == %u4e2d%u6587
encodeURI('中文') == %e4%b8%ad%e6%96%87当需要通过url以get方式提交中文参数的时候,即便以如上方法转码了.也传递不出去,因为url中%为转义字符.
问题就是:为什么要有如上设计?即为什么如上3个方法处理过的字符串刚好和url的转义字符冲突呢?更进一步,不考虑服务器以何种编码处理url,如何在页面转码以及在服务端的解码?现在我的做法是页面jsvar url = 'xxxxx.do?param='+encodeURI('中文').replace(/%/g,'%25');服务端java.net.URLDecoder.decode(request.getParameter('param'),"utf-8");感觉非常别扭,有没有好点的方法,或者你们怎么处理这种问题呢?(此时客观原因不能使用post提交)

解决方案 »

  1.   

    encodeURICoponent('xxxxx.do?param=中文');这样应该就可以
      

  2.   

    我知道可以啊。我是说为什么他转码后% 和url转义冲突...
      

  3.   

    为什么他转码后% 和url转义冲突...?啥意思
      

  4.   

    可以encodeURI()两边,取值时然后escape()一遍
      

  5.   

    是什么意思.能再详细一点么.呵呵。和转义冲突的意思就是
    xxxx.do?param=%1233比如这样。后台将什么都接收不到.因为%是转义字符.后台取param的值还是空的.
    如果直接xxxx.do?param=encodeURI('中文之类')的。这样结果出来还是类似
    xxxx.do?param=%e4%b8%ad%e6%96%87 百分号后转了下.就乱了.
    还是我用法不对。该encodeURI(xxxx.do?param='中文')把地址全包住?
    明天再试下.
      

  6.   

    回楼上 ,encodeURIComponent('xxxxx.do?param=中文');问号也被编码了.不能.服务端都分不出哪个是请求地址哪个是请求参数了.
    encodeURI('xxxxx.do?param=中文');问号虽然不被编码,可出现了%到服务器上也不正常了..
    还是行不通.应该很简单啊..
      

  7.   

    当服务端以 UTF-8 解 URI 时,可以var url = 'xxxxx.do?param='+encodeURIComponent('中文');接收request.setCharacterEncoding("UTF-8"); // 在未读取任何参数之前,设置好, 一般放在响应程序的首行
    String param = request.getParameter("param");
    不确定服务器端以何种编码解 URI ,且无法自己控制时
    可用二次编码function encURI(x) { return encodeURIComponent(encodeURIComponent(x)); }
    var url = 'xxxxx.do?param='+encURI('中文');
    // 服务端需要用 URLDecoder.decode 多解一次 URI
    java.net.URLDecoder.decode(request.getParameter('param'), "utf-8");
      

  8.   

    前端可以encodeURI()两边,后台取值时然后escape()一遍
      

  9.   

    明白了。两遍encodeURI的作用.第一次.将中文转为%ea%76%43形式,第二次,将%号转为%25.以便在url地址中传送.接收的时候,直接取到的应该是%ea%76%43形式.所以一次解码就可以恢复到中文状态.
      

  10.   

    9楼说的第一种方法行不通.即便服务端以 UTF-8 解 URI ,被转码后的字符依然是%23%21形式,由于%为url转义字符,所以传到服务端的时候已经变了.