Ajax传输中文乱码问题的解决办法
AJAX简介
AJAX=AsynchronousJavaScriptandXML(异步的JavaScript和XML)。
AJAX不是新的编程语言,而是一种使用现有标准的新方法。
AJAX是与服务器交换数据并更新部分网页的艺术,在不重新加载整个页面的情况下。
ajax传输中文乱码问题描述:
我是在一个jsp页面有一个保存按钮,点击时会触发saveForm()的js函数,在saveForm()函数里经过校验后,会通过ajax发送数据请求,这样就不用通过提交表单来传输数据了,ajax估计就是这样的好处吧,目前对ajax还不太熟悉。
ajax传输乱码时的代码:
functionsaveForm(){
if(document.theformadd.onsubmit()){
disableAllBtn(true);
j$.ajax({
type:"get",
url:"add_form_do.jsp",
data:{
problem_id:j$("#problem_id").val(),
product_id:"<%=product_id%>",
productId:j$("#productId").val(),
depart_id:j$("#depart_id").val(),
fk_busi_id:j$("#fk_busi_id").val(),
fk_type:j$("#fk_type").val(),
fk_source:j$("#fk_source").val(),
fk_info:j$("#fk_info").val(),
fk_name:j$("#fk_name").val(),
fk_bank_name:j$("#fk_bank_name").val(),
fk_bank_acct:j$("#fk_bank_acct").val(),
sk_name:j$("#sk_name").val(),
sk_bank_name:j$("#sk_bank_name").val(),
sk_bank_acct:j$("#sk_bank_acct").val(),
fk_money:j$("#fk_money").val(),
fk_summary:j$("#fk_summary").val(),
fk_date:j$("#fk_date").val(),
input_man:"<%=input_operatorCode%>"
},
success:function(ret){
if(ret==1){
sl_alert("保存成功!");
}else{
sl_alert(ret);
}
window.returnValue=true;
window.close();
}
});
}
}
然后我们在add_form_do.jsp中获取数据
<%@pagecontentType="text/html;charset=GBK"import="java.math.*,com.enfo.intrust.intrust.vo.*,java.io.*,com.enfo.intrust.web.*,java.util.*,com.enfo.intrust.dao.*,com.enfo.intrust.intrust.*,com.enfo.intrust.tools.*,com.enfo.intrust.project.*"%>
<scripttype="text/javascript"src="<%=request.getContextPath()%>/ext2.0/ext-base.js"></script>
<scripttype="text/javascript"src="<%=request.getContextPath()%>/ext2.0/ext-all.js"></script>
<%@includefile="/includes/operator.inc"%>
<%
try{
product_id=Utility.parseInt(Utility.trimNull(request.getParameter("product_id")),product_id);
UnpostwarrantLocallocal=EJBFactory.getUnpostwarrant();
Integerproblem_id=Utility.parseInt(request.getParameter("problem_id"),newInteger(0));
Integerdepart_id=Utility.parseInt(request.getParameter("depart_id"),newInteger(0));//部门
IntegerproductId=Utility.parseInt(Utility.trimNull(request.getParameter("productId")),product_id);
Stringfk_busi_id=Utility.trimNull(request.getParameter("fk_busi_id"));//字典1206费用
Stringfk_type=Utility.trimNull(request.getParameter("fk_type"));//付款方式2103
Stringfk_source=Utility.trimNull(request.getParameter("fk_source"));//付款依据2104
Stringfk_info=Utility.trimNull(request.getParameter("fk_info"));//票据号码
Stringfk_name=Utility.trimNull(request.getParameter("fk_name"));//付款单位
Stringfk_bank_name=Utility.trimNull(request.getParameter("fk_bank_name"));//付款银行名称
Stringfk_bank_acct=Utility.trimNull(request.getParameter("fk_bank_acct"));//付款银行账号
Stringsk_name=Utility.trimNull(request.getParameter("sk_name"));//收款单位
Stringsk_bank_name=Utility.trimNull(request.getParameter("sk_bank_name"));//收款银行名称
Stringsk_bank_acct=Utility.trimNull(request.getParameter("sk_bank_acct"));//收款银行账号
BigDecimalfk_money=Utility.parseDecimal(Utility.trimNull(request.getParameter("fk_money")).replaceAll(",",""),newBigDecimal(0));//金额
Stringfk_summary=Utility.trimNull(request.getParameter("fk_summary"));//备注
Integerfk_date=Utility.parseInt(request.getParameter("fk_date"),newInteger(Utility.getCurrentDate()));//要求付款日期
local.setProblem_id(problem_id);
//local.setProduct_id(product_id);
local.setProduct_id(productId);
local.setDepart_id(depart_id);
local.setFk_busi_id(fk_busi_id);
local.setFk_type(fk_type);
local.setFk_source(fk_source);
local.setFk_info(fk_info);
local.setFk_name(fk_name);
local.setFk_bank_name(fk_bank_name);
local.setFk_bank_acct(fk_bank_acct);
local.setSk_name(sk_name);
local.setSk_bank_name(sk_bank_name);
local.setSk_bank_acct(sk_bank_acct);
local.setFk_money(fk_money);
local.setFk_summary(fk_summary);
local.setFk_date(fk_date);
local.setInput_man(input_operatorCode);
local.addFinacialcardInfoGuotou();
out.clear();
response.getWriter().write("1");
}catch(Exceptione){
out.clear();
response.getWriter().write(e.getMessage());
}
%>
这时候我接受到的数据会是中文乱码,不管传输方式是get,还是post都会中文乱码
解决方案:
我们可以在传输时对数据重新编码,然后在接受数据时重新解码。其实乱码的问题就是编码格式冲突,导致解码的密钥对之前格式解析错误,导致乱码。在传输时,在需要传输中文数据前面加一个encodeURI()编码,例如:encodeURI(j$("#fk_info").val());在接受需要中文数据的前面加一个java.net.URLDecoder.decode(value,"UTF-8"),例如
Stringfk_bank_name=Utility.trimNull(request.getParameter("fk_bank_name"));Stringtrans=java.net.URLDecoder.decode(fk_bank_name,"UTF-8");
具体修改后的全部代码如下:
修复后ajax传输的代码:
functionsaveForm(){
if(document.theformadd.onsubmit()){
disableAllBtn(true);
j$.ajax({
type:"get",
url:"add_form_do.jsp",
data:{
problem_id:j$("#problem_id").val(),
product_id:"<%=product_id%>",
productId:j$("#productId").val(),
depart_id:j$("#depart_id").val(),
fk_busi_id:j$("#fk_busi_id").val(),
fk_type:j$("#fk_type").val(),
fk_source:j$("#fk_source").val(),
fk_info:encodeURI(j$("#fk_info").val()),
fk_name:encodeURI(j$("#fk_name").val()),
fk_bank_name:encodeURI(j$("#fk_bank_name").val()),
fk_bank_acct:encodeURI(j$("#fk_bank_acct").val()),
sk_name:encodeURI(j$("#sk_name").val()),
sk_bank_name:encodeURI(j$("#sk_bank_name").val()),
sk_bank_acct:encodeURI(j$("#sk_bank_acct").val()),
fk_money:j$("#fk_money").val(),
fk_summary:encodeURI(j$("#fk_summary").val()),
fk_date:j$("#fk_date").val(),
input_man:"<%=input_operatorCode%>"
},
success:function(ret){
if(ret==1){
sl_alert("保存成功!");
}else{
sl_alert(ret);
}
window.returnValue=true;
window.close();
}
});
}
}
修复后add_form_do.jsp中获取数据:
<%@pagecontentType="text/html;charset=GBK"import="java.math.*,com.enfo.intrust.intrust.vo.*,java.io.*,com.enfo.intrust.web.*,java.util.*,com.enfo.intrust.dao.*,com.enfo.intrust.intrust.*,com.enfo.intrust.tools.*,com.enfo.intrust.project.*"%>
<scripttype="text/javascript"src="<%=request.getContextPath()%>/ext2.0/ext-base.js"></script>
<scripttype="text/javascript"src="<%=request.getContextPath()%>/ext2.0/ext-all.js"></script>
<%@includefile="/includes/operator.inc"%>
<%
try{
product_id=Utility.parseInt(Utility.trimNull(request.getParameter("product_id")),product_id);
UnpostwarrantLocallocal=EJBFactory.getUnpostwarrant();
Integerproblem_id=Utility.parseInt(request.getParameter("problem_id"),newInteger(0));
Integerdepart_id=Utility.parseInt(request.getParameter("depart_id"),newInteger(0));//部门
IntegerproductId=Utility.parseInt(Utility.trimNull(request.getParameter("productId")),product_id);
Stringfk_busi_id=Utility.trimNull(request.getParameter("fk_busi_id"));//字典1206费用
Stringfk_type=Utility.trimNull(request.getParameter("fk_type"));//付款方式2103
Stringfk_source=Utility.trimNull(request.getParameter("fk_source"));//付款依据2104
Stringfk_info=Utility.trimNull(request.getParameter("fk_info"));//票据号码
Stringfk_name=Utility.trimNull(request.getParameter("fk_name"));//付款单位
Stringfk_bank_name=Utility.trimNull(request.getParameter("fk_bank_name"));//付款银行名称
Stringfk_bank_acct=Utility.trimNull(request.getParameter("fk_bank_acct"));//付款银行账号
Stringsk_name=Utility.trimNull(request.getParameter("sk_name"));//收款单位
Stringsk_bank_name=Utility.trimNull(request.getParameter("sk_bank_name"));//收款银行名称
Stringsk_bank_acct=Utility.trimNull(request.getParameter("sk_bank_acct"));//收款银行账号
BigDecimalfk_money=Utility.parseDecimal(Utility.trimNull(request.getParameter("fk_money")).replaceAll(",",""),newBigDecimal(0));//金额
Stringfk_summary=Utility.trimNull(request.getParameter("fk_summary"));//备注
Integerfk_date=Utility.parseInt(request.getParameter("fk_date"),newInteger(Utility.getCurrentDate()));//要求付款日期
local.setProblem_id(problem_id);
//local.setProduct_id(product_id);
local.setProduct_id(productId);
local.setDepart_id(depart_id);
local.setFk_busi_id(fk_busi_id);
local.setFk_type(fk_type);
local.setFk_source(fk_source);
local.setFk_info(java.net.URLDecoder.decode(fk_info,"UTF-8"));
local.setFk_name(java.net.URLDecoder.decode(fk_name,"UTF-8"));
local.setFk_bank_name(java.net.URLDecoder.decode(fk_bank_name,"UTF-8"));
local.setFk_bank_acct(java.net.URLDecoder.decode(fk_bank_acct,"UTF-8"));
local.setSk_name(java.net.URLDecoder.decode(sk_name,"UTF-8"));
local.setSk_bank_name(java.net.URLDecoder.decode(sk_bank_name,"UTF-8"));
local.setSk_bank_acct(java.net.URLDecoder.decode(sk_bank_acct,"UTF-8"));
local.setFk_money(fk_money);
local.setFk_summary(java.net.URLDecoder.decode(fk_summary,"UTF-8"));
local.setFk_date(fk_date);
local.setInput_man(input_operatorCode);
local.addFinacialcardInfoGuotou();
out.clear();
response.getWriter().write("1");
}catch(Exceptione){
out.clear();
response.getWriter().write(e.getMessage());
}
%>
注意事项:
如果是接受数据不是jsp页面,而是Java类的时候,只需要URLDecoder.decode(value,"UTF-8");来解码,然后导入相应的包。还有传输时可能需要两次编码encodeURI(encodeURI(j$("#fk_info").val())),具体原因是我们通过request.getParameter()来获取数据时就会进行一次解码操作,解码时不变。
以上所述是小编给大家介绍的Ajax传输中文乱码问题的解决办法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!