Ajax傳輸中文亂碼問題的解決辦法
AJAX簡介
AJAX = Asynchronous JavaScript and XML(異步的 JavaScript 和 XML)。
AJAX 不是新的編程語言,而是一種使用現(xiàn)有標(biāo)準(zhǔn)的新方法。
AJAX 是與服務(wù)器交換數(shù)據(jù)并更新部分網(wǎng)頁的藝術(shù),在不重新加載整個(gè)頁面的情況下。
ajax傳輸中文亂碼問題描述:
我是在一個(gè)jsp頁面有一個(gè)保存按鈕,點(diǎn)擊時(shí)會(huì)觸發(fā)saveForm()的js函數(shù),在saveForm()函數(shù)里經(jīng)過校驗(yàn)后,會(huì)通過ajax發(fā)送數(shù)據(jù)請(qǐng)求,這樣就不用通過提交表單來傳輸數(shù)據(jù)了,ajax估計(jì)就是這樣的好處吧,目前對(duì)ajax還不太熟悉。
ajax傳輸亂碼時(shí)的代碼:
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(); } }); } }
然后我們?cè)赼dd_form_do.jsp中獲取數(shù)據(jù)
<%@ 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 費(fèi)用 String fk_type = Utility.trimNull(request.getParameter("fk_type")); //付款方式 2103 String fk_source = Utility.trimNull(request.getParameter("fk_source")); //付款依據(jù) 2104 String fk_info = Utility.trimNull(request.getParameter("fk_info")); //票據(jù)號(hào)碼 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")); //付款銀行賬號(hào) 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")); //收款銀行賬號(hào) 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()); } %>
這時(shí)候我接受到的數(shù)據(jù)會(huì)是中文亂碼,不管傳輸方式是get,還是post都會(huì)中文亂碼
解決方案:
我們可以在傳輸時(shí)對(duì)數(shù)據(jù)重新編碼,然后在接受數(shù)據(jù)時(shí)重新解碼。其實(shí)亂碼的問題就是編碼格式?jīng)_突,導(dǎo)致解碼的密鑰對(duì)之前格式解析錯(cuò)誤,導(dǎo)致亂碼。在傳輸時(shí),在需要傳輸中文數(shù)據(jù)前面加一個(gè)encodeURI()編碼,例如:encodeURI(j$("#fk_info").val());在接受需要中文數(shù)據(jù)的前面加一個(gè)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");
具體修改后的全部代碼如下:
修復(fù)后ajax傳輸?shù)拇a:
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(); } }); } }
修復(fù)后add_form_do.jsp中獲取數(shù)據(jù):
<%@ 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 費(fèi)用 String fk_type = Utility.trimNull(request.getParameter("fk_type")); //付款方式 2103 String fk_source = Utility.trimNull(request.getParameter("fk_source")); //付款依據(jù) 2104 String fk_info = Utility.trimNull(request.getParameter("fk_info")); //票據(jù)號(hào)碼 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")); //付款銀行賬號(hào) 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")); //收款銀行賬號(hào) 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()); } %>
注意事項(xiàng):
如果是接受數(shù)據(jù)不是jsp頁面,而是Java類的時(shí)候,只需要URLDecoder.decode(value, "UTF-8");來解碼,然后導(dǎo)入相應(yīng)的包。還有傳輸時(shí)可能需要兩次編碼encodeURI(encodeURI(j$("#fk_info").val())),具體原因是我們通過request.getParameter()來獲取數(shù)據(jù)時(shí)就會(huì)進(jìn)行一次解碼操作,解碼時(shí)不變。
以上所述是小編給大家介紹的Ajax傳輸中文亂碼問題的解決辦法,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
Ajax bootstrap美化網(wǎng)頁并實(shí)現(xiàn)頁面的加載刪除與查看詳情
Bootstrap是Twitter推出的一個(gè)開源的用于前端開發(fā)的工具包,Bootstrap提供了優(yōu)雅的HTML和CSS規(guī)范,它即是由動(dòng)態(tài)CSS語言Less寫成。下面通過本文給大家介紹Ajax bootstrap美化網(wǎng)頁并實(shí)現(xiàn)頁面的加載刪除與查看詳情,需要的朋友可以參考下2017-03-03ajax 登錄功能簡單實(shí)現(xiàn)(未連接數(shù)據(jù)庫)
未連接數(shù)據(jù)庫下實(shí)現(xiàn)ajax 登錄功能判斷登陸成功與失敗,喜歡ajax的朋友可以參考下哈,希望對(duì)大家有所幫助2013-05-05用AJAX實(shí)現(xiàn)頁面登陸以及注冊(cè)用戶名驗(yàn)證的簡單實(shí)例
下面小編就為大家?guī)硪黄肁JAX實(shí)現(xiàn)頁面登陸以及注冊(cè)用戶名驗(yàn)證的簡單實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-10-10