Ajax乱码解决终极方案

canca17年前 (2007-09-05)Ajax270

CAnca

-----------------------------------------------------------------------------------

原创作品,CAnca Software Office.如要转载,请保留版权信息!

http://cancait.blog.163.com 

E-mail:cancait@msn.com

-----------------------------------------------------------------------------------

1.       使用JS中的encodeURIComponentencodeURI方法。

说明:

 

encodeURIComponent(String)

对传递参数进行设置。不编码字符有71个:! '()*-._~0-9a-zA-Z

例:

var url = “<a href=’http://cancait.blog.163.com/name=” + encodeURIComponent(“中国”) + “’>中国</a>”;

 

encodeURI(String)

URL整体转换。不编码字符有82个:!#$&'()*+,,,-./:;=?@_~0-9a-zA-Z

例:

var url = “<a href=’” + encodeURI(“http://cancait.blog.163.com/name=中国”) + “’>中国</a>”;

 

乱码处理实例:

/////////////////////////////////////////////////////////////////////////////////////

初始页面内容如下(hello.jsp)

/////////////////////////////////////////////////////////////////////////////////////
<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
<%String path = request.getContextPath();%>


  
     AJAX <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">提交页面</span> <span lang="EN-US"><font face="Times New Roman">

   
     
  
   提交
" onclick="justdo()"/>
   

/////////////////////////////////////////////////////////////////////////////////////
   ajax 请求处理页面( act.jsp )的内容如下 :
/////////////////////////////////////////////////////////////////////////////////////
<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
<%String path = request.getContextPath();%>

<
%@page import="java.net.URLDecoder"%>

  
     ajax deal


    
  
  
   <%
   //
遍历输出参数内容。
   for (Enumeration e = request.getParameterNames(); e.hasMoreElements();) {
    String h = (String) e.nextElement();
    String v = request.getParameter(h);
    String mm =   java.net.URLDecoder.decode(v
"UTF-8");
    System.out.println("
请求参数 : " + h + " = " + mm);
   }
    %>
  

/////////////////////////////////////////////////////////////////////////////////////

 

说明:

java.net.URLencode java.net.URLDecode 分别对应于 JavaScript中的encodeURI decodeURIencodeURIComponent decodeURIComponent.

 

为什么要连续两次调用encodeURI(String)方法呢?是因为Java中的request.getParameter(String)方法会进行一次URI的解码过程,调用时内置的解码过程会导致乱码出现。而URI编码两次后,request.getParameter(String)函数得到的是原信息URI编码一次的内容。接着用java.net.URLDecoder.decode(String str,String codename)方法,将已经编码的URI 转换成原文。

2.       使用JS中的escape 方法。

说明:

escape(String)

0-255以外的unicode值进行编码时输出%u****格式,其它情况下escapeencodeURIencodeURIComponent编码结果相同。

例:

var url = “中国”) + “’>中国”;

 

乱码处理实例:

/////////////////////////////////////////////////////////////////////////////////////

例子跟上面一样。只有这里不同。

(hello.jsp)

post = escape(post);
   post = escape (post);//
两次,很关键

       

(act.jsp)

String h = (String) e.nextElement();
    String v = request.getParameter(h);
String mm =   EscapeUnescape.unescape(v
"UTF-8");
    System.out.println("
请求参数: " + h + " = " + mm);


/////////////////////////////////////////////////////////////////////////////////////

(EscapeUnescape.java)Java中的escapeunescape.内容如下:

/////////////////////////////////////////////////////////////////////////////////////

package cn.kgnews.util;

 

public class EscapeUnescape {

public static String escape(String src) {

int i;

char j;

StringBuffer tmp = new StringBuffer();

tmp.ensureCapacity(src.length() * 6);

 

for (i = 0; i < src.length(); i++) {

 

        j = src.charAt(i);

       

        if (Character.isDigit(j) || Character.isLowerCase(j)

                || Character.isUpperCase(j))

        tmp.append(j);

        else if (j < 256) {

        tmp.append("%");

                if (j < 16)

                tmp.append("0");

        tmp.append(Integer.toString(j 16));

        } else {

        tmp.append("%u");

        tmp.append(Integer.toString(j 16));

        }

        }

return tmp.toString();

}

 

public static String unescape(String src) {

StringBuffer tmp = new StringBuffer();

tmp.ensureCapacity(src.length());

int lastPos = 0 pos = 0;

char ch;

while (lastPos < src.length()) {

        pos = src.indexOf("%" lastPos);

        if (pos == lastPos) {

                if (src.charAt(pos + 1) == 'u') {

                ch = (char) Integer.parseInt(src

                        .substring(pos + 2 pos + 6) 16);

                tmp.append(ch);

                lastPos = pos + 6;

                } else {

                ch = (char) Integer.parseInt(src

                        .substring(pos + 1 pos + 3) 16);

                tmp.append(ch);

                lastPos = pos + 3;

                }

        } else {

                if (pos == -1) {

                tmp.append(src.substring(lastPos));

                lastPos = src.length();

                } else {

                tmp.append(src.substring(lastPos

相关文章

新认识的Ajax框架

要重装电脑啦!!在这里保存一下。。呵呵。 Taconite:很多东东自己写。但这个的速度飞快。 Scriptaculous:这个东东最爽。哈哈。  ...

DWR中各种java方法的调用

DWR是一个框架,简单的说就是能够在javascript直接调用java方法,而不必去写一大堆的javascript代码。它的实现是基于ajax的,可以实现无刷新效果。   &n...

dwr配置文件dwr.xml详解

1、最小配置 java代码:  <servlet>   <servlet-name>dwr-invoker</servlet-name&...

options请求(跨域预检)

概述options 请求就是预检请求,可用于检测服务器允许的 http 方法。当发起跨域请求时,由于安全原因,触发一定条件时浏览器会在正式请求之前自动先发起 OPTIONS 请求,即 CORS 预检请...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。