请教一个乱码的问题

页面编码:gbk

后台转码:

普通提交(页面submit直接提交)后台无乱码。

采用prototype.js的ajax.request提交方式,就出现乱码了,怎么转换都不行。

prototype.js有一句是post采用的UTF-8编码。

我再换成get提交。还是乱码。

怎么弄才让prototype提交不乱码。

前台:

var url = "${base}/news/addQuestionCom.shtml";
var params = "mobile=" + mobile.value+"&qContent=" + encodeURI(encodeURI(qContent.value)) +"&qType=" + qType.value;
var myAjax = new Ajax.Request(url,
{
method:'post',
parameters:params,
onComplete:thinks,
asynchronous:true
}
);//注意了,红色部分:要进行2次编码。

后台:

import java.net.URLDecoder;

qContent=URLDecoder.decode(qContent,"utf8"); //post 传递的时候,一定是用utf8编码的,url 自己可以设定

[quote]prototype.js 中文乱码问题的解决办法
我的问题是,在页面上用GBK,然后用ajax发送数据,
function doupdate(){
if(check()){
var frm = $("myform");
var url = "fpupdate.do";
var pars = Form.serialize(frm);
new Ajax.Request(url,{method: 'post',parameters:pars,onComplete: callback});
}
}
function callback(xml){
var msg = xml.responseText;
if(msg =="5"){
alert("修改保存成功!");
window.close();
}else if(msg=="1"){
alert("所开发票总金额超出单张发票最大限额!请修改后重试!");
}else if(msg=="2"){
alert("所开发票金额累计已超出今天最大限额!请修改后重试!");
}else if(msg=="3"){
alert("所开发票金额累计超出本月发票最大限额!请修改后重试!");
}else if(msg=="4"){
alert("所开发票总金额累计超出今年发票最大限额!请修改后重试!");
}
}
然后发现,在修改成功后,向数据库中保存之前,取到的参数值就出现乱码了,结果,以乱码更新到数据库,在页面上查找更新后的结果时,就出现乱码了。我的解决办法是:

页面端不变,在action服务器端用
String kprq = new String(request.getParameter("kprq").getBytes("gbk"),"utf-8");// 开票日期

这样的方法进行转码,因为prototype.js默认用UTF-8进行数据传递的,所以在服务器端要把utf-8再转换成GBK,这样就OK了。下面是从网上查找的资料,方便参考

AJAX中文问题分为两大类:
1)发送路径中的参数有中文,在服务器段接收参数值是乱码
例如:
var url="a.jsp?name=小李";
xmlHTTP.open ("post",url,true);

解决办法: 
利用javascript的提供的escape()或encodeURI()方法 
例如: 
客户端: 
var url="a.jsp?name=小李"; 
url=encodeURI(url); 
url=encodeURI(url); //两次,很关键[具体为什么,我也不清楚] 
/********************************************/ 
也有人写成var url="a.jsp?name=escape("小李")"; 
功能和encodeURI方法类似。 
/********************************************/ 
xmlHTTP.setrequestheader("cache-control","no-cache"); 
xmlHTTP.setrequestheader("Content-Type","application/x-www-form-urlencoded"); 
xmlHTTP.setrequestheader("contentType","text/html;charset=uft-8")//指定发送数据的编码格式 
xmlHTTP.open ("post",url,true);

服务器端: 
String name = request.getParameter("name"); 
name = java.net.URLDecoder.decode("name", "UTF-8"); 

2)返回来的responseText或responseXML的值中含有中文是乱码 
原因:AJAX在接收responseText或responseXML的值的时候是按照UTF-8的格式来解码的,如果服务器段发送的数据不是UTF-8的格式,那么接收responseText或responseXML的值有可能为乱码。 
解决办法:在服务器指定发送数据的格式: 
在jsp文件中: 
response.setContentType("text/text;charset=UTF-8");//返回的是txt文本文件 
或是 
response.setContentType("text/xml;charset=UTF-8");//返回的xml文件 
总结: 
1)ajax提交数据的格式默认为utf-8,利用javascript的提供的escape()或encodeURI()方法.在服务器端接收的时候要使用java.net.URLDecoder.decode("","UTF-8")方法进行解码. 
2)xtmlhttp 返回的数据默认的字符编码是utf-8,所以服务器要向客户端发送数据的时候,也要采用utf-8编码.如果上述方法仍然解决不了乱码问题,那你尝试一下把jsp,htm,java文件用UTF-8编码格式保存. 
总之:前后台数据交互都采用utf-8编码就行了.

解决:

在url中把中文部分用encodeURI加密两次
例如 var url = aaa.do?xxxx=encodeURI(encodeURI("哈哈"))
在java类解密一次
java.net.URLDecoder.decode(request.getParameter("xxxx"),"utf-8");
ajax只支持utf-8格式的

首先,改成
response.setCharacterEncoding("GB2312");
servlet中处理时候,需要
String str = new String("中文".getBytes("iso-8859-1"),"gb2312");
实在不行你就写一个过滤器吧,这样也稳定。
[/quote]

http://hi.baidu.com/kaisep/blog/item/328c25f3f9c7e85a352accb3.html

encodeURI()方法:把URI字符串采用UTF-8编码格式转化成escape格式的字符串。不会被此方法编码的字符:! @ # $& * ( ) = : / ; ? + '

encodeURIComponent()方法:把URI字符串采用UTF-8编码格式转化成escape格式的字符串。与encodeURI()相比,这个方法将对更多的字符进行编码,比如 / 等字符。所以如果字符串里面包含了URI的几个部分的话,不能用这个方法来进行编码,否则 / 字符被编码之后URL将显示错误。不会被此方法编码的字符:! * ( )

在使用encodeURIComponent对URL的参数进行编码,再发送,如:
"test.action?" + encodeURIComponent("a=中国&b=人民");

然后在Java代码中解码:
java.net.URLDecoder.decode(接收到的参数, "UTF-8");

这个上面不是说了,默认只能用utf-8发送了,你只有在服务端那边转换,或者在post的时候URL加密