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

前端技术 2023/09/01 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传输中文乱码问题的解决办法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对phpstudy网站的支持!

本文地址:https://www.stayed.cn/item/1788

转载请注明出处。

本站部分内容来源于网络,如侵犯到您的权益,请 联系我

我的博客

人生若只如初见,何事秋风悲画扇。