我的开发环境:XP, eclipse,使用GB2312 编码 。 当遇到这个问题时,到网上去查了好多文章,提到几种 解决方案 ,如: 全站 UTF-8编码;请求头编码为中文;使用javascript中的escape; 今天把问题解决了,很简单,是使用escape(或encodeURI,两个 函数 javascript的函数,功能基本相同,可以查一下相关的帮助),但要使用两次,这是解决问题的关键。 我的例子涉及两个 页面 ,一个是初始页面,一个是AJAX请求处理页面。 初始页面内容如下(hello.jsp):/<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%><%String path = request.getContextPath();%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <head> <title>AJAX提交页面</title> <meta http-equiv="Content-Type" content="text/html; charset=GB18030"> <script type="text/javascript"> function justdo(){ var post="name= 王力猛 &email=wallimn@sohu.com&bokee=http://wallimn.bokee.com"; post = encodeURI(post); post = encodeURI(post);//两次,很关键 var xmlObj = new ActiveXObject('Msxml2.XMLHTTP'); var URL = '<%= path%>/page/act.jsp';//文件名需要调整成测试时的相应位置? xmlObj.open ('post',URL,true); xmlObj.setrequestheader("cache-control","no-cache"); xmlObj.setrequestheader("Content-Type","application/x-www-form-urlencoded"); xmlObj.send (post);//注意:POST方式,使用这个来发送内容? } </script> </head> <body> <input type="button" value="提交" οnclick="justdo()"/> </body></html>/ ajax请求处理页面(act.jsp)的内容如下:这个文件可以是.java格式!/<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%><%String path = request.getContextPath();%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><%@page import="java.net.URLDecoder"%><html> <head> <title>ajax deal</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> </head> <body> <% //遍历输出参数内容。 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); } %> </body></html>/ 分析:当调用request.getParameter()函数时,会自动进行一次URI的解码过程,调用时内置的解码过程会导致 乱码 出现。而URI编码两次后,request.getParameter()函数得到的是原信息URI编码一次的内容。再用可控的解码函数java.net.URLDecoder.decode()就可解出原始的正确的信息。