0 0

请教一个乱码的问题5

页面编码:gbk

后台转码:<constant name="struts.i18n.encoding" value="GBK" />

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

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

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

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

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

问题补充:
beneo 写道
引用
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");
实在不行你就写一个过滤器吧,这样也稳定。


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


补充一下:用的是struts2,这里乱码的是一个title的属性。页面提交post
提交的时候我Form.serialize打印出来看了一下是%xx3个一组的,是UTF-8的编码格式吧?呵呵!
现在我只想用post提交。
new String()这种处理方法我试过了,怎么不行呢?神了...

问题补充:
yqin 写道
前台:

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 自己可以设定


你这方法酷了,顺利解决!!3Q
同时感谢第一位哥们。呵呵
2011年1月06日 09:49

4个答案 按时间排序 按投票排序

0 0

采纳的答案

前台:

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 自己可以设定

2011年1月06日 09:58
0 0

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

2011年1月06日 10:15
0 0

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");

2011年1月06日 10:01
0 0

引用
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");
实在不行你就写一个过滤器吧,这样也稳定。


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

2011年1月06日 09:54

相关推荐

Global site tag (gtag.js) - Google Analytics