欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Ajax传输中文乱码问题的解决办法

程序员文章站 2022-11-22 20:55:09
ajax简介 ajax = asynchronous javascript and xml(异步的 javascript 和 xml)。 ajax 不是新的编程语言,而...

ajax简介

ajax = asynchronous javascript and xml(异步的 javascript 和 xml)。

ajax 不是新的编程语言,而是一种使用现有标准的新方法。

ajax 是与服务器交换数据并更新部分网页的艺术,在不重新加载整个页面的情况下。

ajax传输中文乱码问题描述:

  我是在一个jsp页面有一个保存按钮,点击时会触发saveform()的js函数,在saveform()函数里经过校验后,会通过ajax发送数据请求,这样就不用通过提交表单来传输数据了,ajax估计就是这样的好处吧,目前对ajax还不太熟悉。

ajax传输乱码时的代码:

function saveform(){
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中获取数据

<%@ page contenttype="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.*" %>
<script type="text/javascript" src="<%=request.getcontextpath()%>/ext2.0/ext-base.js"></script>
<script type="text/javascript" src="<%=request.getcontextpath()%>/ext2.0/ext-all.js"></script>
<%@ include file="/includes/operator.inc" %>
<%
try{
product_id = utility.parseint(utility.trimnull(request.getparameter("product_id")),product_id);
unpostwarrantlocal local = ejbfactory.getunpostwarrant();
integer problem_id = utility.parseint(request.getparameter("problem_id"),new integer(0));
integer depart_id = utility.parseint(request.getparameter("depart_id"),new integer(0)); //部门
integer productid = utility.parseint(utility.trimnull(request.getparameter("productid")),product_id);
string fk_busi_id = utility.trimnull(request.getparameter("fk_busi_id")); //字典1206 费用
string fk_type = utility.trimnull(request.getparameter("fk_type")); //付款方式 2103
string fk_source = utility.trimnull(request.getparameter("fk_source")); //付款依据 2104
string fk_info = utility.trimnull(request.getparameter("fk_info")); //票据号码
string fk_name = utility.trimnull(request.getparameter("fk_name")); //付款单位
string fk_bank_name = utility.trimnull(request.getparameter("fk_bank_name")); //付款银行名称
string fk_bank_acct = utility.trimnull(request.getparameter("fk_bank_acct")); //付款银行账号
string sk_name = utility.trimnull(request.getparameter("sk_name")); //收款单位
string sk_bank_name = utility.trimnull(request.getparameter("sk_bank_name")); //收款银行名称
string sk_bank_acct = utility.trimnull(request.getparameter("sk_bank_acct")); //收款银行账号
bigdecimal fk_money = utility.parsedecimal(utility.trimnull(request.getparameter("fk_money")).replaceall(",",""),new bigdecimal(0)); //金额
string fk_summary = utility.trimnull(request.getparameter("fk_summary")); //备注
integer fk_date = utility.parseint(request.getparameter("fk_date"),new integer(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(exception e){
out.clear();
response.getwriter().write(e.getmessage());
}
%>

这时候我接受到的数据会是中文乱码,不管传输方式是get,还是post都会中文乱码

解决方案:

  我们可以在传输时对数据重新编码,然后在接受数据时重新解码。其实乱码的问题就是编码格式冲突,导致解码的密钥对之前格式解析错误,导致乱码。在传输时,在需要传输中文数据前面加一个encodeuri()编码,例如:encodeuri(j$("#fk_info").val());在接受需要中文数据的前面加一个java.net.urldecoder.decode(value, "utf-8"),例如
string fk_bank_name = utility.trimnull(request.getparameter("fk_bank_name")); string trans = java.net.urldecoder.decode(fk_bank_name, "utf-8");
具体修改后的全部代码如下:

修复后ajax传输的代码:

function saveform(){
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中获取数据:

<%@ page contenttype="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.*" %>
<script type="text/javascript" src="<%=request.getcontextpath()%>/ext2.0/ext-base.js"></script>
<script type="text/javascript" src="<%=request.getcontextpath()%>/ext2.0/ext-all.js"></script>
<%@ include file="/includes/operator.inc" %>
<%
try{
product_id = utility.parseint(utility.trimnull(request.getparameter("product_id")),product_id);
unpostwarrantlocal local = ejbfactory.getunpostwarrant();
integer problem_id = utility.parseint(request.getparameter("problem_id"),new integer(0));
integer depart_id = utility.parseint(request.getparameter("depart_id"),new integer(0)); //部门
integer productid = utility.parseint(utility.trimnull(request.getparameter("productid")),product_id);
string fk_busi_id = utility.trimnull(request.getparameter("fk_busi_id")); //字典1206 费用
string fk_type = utility.trimnull(request.getparameter("fk_type")); //付款方式 2103
string fk_source = utility.trimnull(request.getparameter("fk_source")); //付款依据 2104
string fk_info = utility.trimnull(request.getparameter("fk_info")); //票据号码
string fk_name = utility.trimnull(request.getparameter("fk_name")); //付款单位
string fk_bank_name = utility.trimnull(request.getparameter("fk_bank_name")); //付款银行名称
string fk_bank_acct = utility.trimnull(request.getparameter("fk_bank_acct")); //付款银行账号
string sk_name = utility.trimnull(request.getparameter("sk_name")); //收款单位
string sk_bank_name = utility.trimnull(request.getparameter("sk_bank_name")); //收款银行名称
string sk_bank_acct = utility.trimnull(request.getparameter("sk_bank_acct")); //收款银行账号
bigdecimal fk_money = utility.parsedecimal(utility.trimnull(request.getparameter("fk_money")).replaceall(",",""),new bigdecimal(0)); //金额
string fk_summary = utility.trimnull(request.getparameter("fk_summary")); //备注
integer fk_date = utility.parseint(request.getparameter("fk_date"),new integer(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(exception e){
out.clear();
response.getwriter().write(e.getmessage());
}
%>

注意事项:

  如果是接受数据不是jsp页面,而是java类的时候,只需要urldecoder.decode(value, "utf-8");来解码,然后导入相应的包。还有传输时可能需要两次编码encodeuri(encodeuri(j$("#fk_info").val())),具体原因是我们通过request.getparameter()来获取数据时就会进行一次解码操作,解码时不变。

以上所述是小编给大家介绍的ajax传输中文乱码问题的解决办法,希望对大家有所帮助