ajax傳輸中文亂碼解決方法


問題描述:

  我是在一個jsp頁面有一個保存按鈕,點擊時會觸發saveForm()的js函數,在saveForm()函數里經過校驗后,會通過ajax發送數據請求,這樣就不用通過提交表單來傳輸數據了,ajax估計就是這樣的好處吧,目前對ajax還不太熟悉。

ajax傳輸亂碼時的代碼:

 1 function saveForm(){
 2     if(document.theformadd.onsubmit()){
 3         disableAllBtn(true);
 4         j$.ajax({
 5             type:"get",
 6             url:"add_form_do.jsp",
 7             data:{
 8                 problem_id : j$("#problem_id").val(),
 9                 product_id : "<%=product_id%>",
10                 productId : j$("#productId").val(),
11                 depart_id : j$("#depart_id").val(),
12                 fk_busi_id : j$("#fk_busi_id").val(),
13                 fk_type : j$("#fk_type").val(),
14                 fk_source : j$("#fk_source").val(),
15                 fk_info : j$("#fk_info").val(),
16                 fk_name : j$("#fk_name").val(),
17                 fk_bank_name : j$("#fk_bank_name").val(),
18                 fk_bank_acct : j$("#fk_bank_acct").val(),
19                 sk_name : j$("#sk_name").val(),
20                 sk_bank_name : j$("#sk_bank_name").val(),
21                 sk_bank_acct : j$("#sk_bank_acct").val(),
22                 fk_money : j$("#fk_money").val(),
23                 fk_summary : j$("#fk_summary").val(),
24                 fk_date : j$("#fk_date").val(),
25                 input_man : "<%=input_operatorCode%>"
26             },
27             success:function(ret){
28                 if(ret == 1) {
29                     sl_alert("保存成功!");
30                 }else{
31                     sl_alert(ret);
32                     
33                 }
34 
35                 window.returnValue=true;
36                 window.close();
37             
38                 
39             }
40         });
41     }
42 }

然后我們在add_form_do.jsp中獲取數據

 1 <%@ 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.*" %>
 2 <script type="text/javascript" src="<%=request.getContextPath()%>/ext2.0/ext-base.js"></script>
 3 <script type="text/javascript" src="<%=request.getContextPath()%>/ext2.0/ext-all.js"></script>
 4 <%@ include file="/includes/operator.inc" %>
 5 <%
 6 try{
 7     product_id = Utility.parseInt(Utility.trimNull(request.getParameter("product_id")),product_id);
 8     
 9     UnpostwarrantLocal local = EJBFactory.getUnpostwarrant();
10     
11     Integer problem_id = Utility.parseInt(request.getParameter("problem_id"),new Integer(0));
12     
13     Integer depart_id = Utility.parseInt(request.getParameter("depart_id"),new Integer(0));        //部門
14     Integer productId = Utility.parseInt(Utility.trimNull(request.getParameter("productId")),product_id);
15     String fk_busi_id = Utility.trimNull(request.getParameter("fk_busi_id"));        //字典1206  費用
16     String fk_type = Utility.trimNull(request.getParameter("fk_type"));        //付款方式  2103
17     String fk_source = Utility.trimNull(request.getParameter("fk_source"));        //付款依據  2104
18     String fk_info = Utility.trimNull(request.getParameter("fk_info"));        //票據號碼
19     String fk_name = Utility.trimNull(request.getParameter("fk_name"));        //付款單位
20     String fk_bank_name = Utility.trimNull(request.getParameter("fk_bank_name"));        //付款銀行名稱
21     String fk_bank_acct = Utility.trimNull(request.getParameter("fk_bank_acct"));        //付款銀行賬號
22     String sk_name = Utility.trimNull(request.getParameter("sk_name"));        //收款單位
23     String sk_bank_name = Utility.trimNull(request.getParameter("sk_bank_name"));        //收款銀行名稱
24     String sk_bank_acct = Utility.trimNull(request.getParameter("sk_bank_acct"));        //收款銀行賬號
25     BigDecimal fk_money = Utility.parseDecimal(Utility.trimNull(request.getParameter("fk_money")).replaceAll(",",""),new BigDecimal(0));        //金額
26     String fk_summary = Utility.trimNull(request.getParameter("fk_summary"));        //備注
27     Integer fk_date = Utility.parseInt(request.getParameter("fk_date"),new Integer(Utility.getCurrentDate()));        //要求付款日期
28     
29     local.setProblem_id(problem_id);
30     //local.setProduct_id(product_id);
31     local.setProduct_id(productId);
32     local.setDepart_id(depart_id);
33     local.setFk_busi_id(fk_busi_id);
34     local.setFk_type(fk_type);
35     local.setFk_source(fk_source);
36     local.setFk_info(fk_info);
37     local.setFk_name(fk_name);
38     local.setFk_bank_name(fk_bank_name);
39     local.setFk_bank_acct(fk_bank_acct);
40     local.setSk_name(sk_name);
41     local.setSk_bank_name(sk_bank_name);
42     local.setSk_bank_acct(sk_bank_acct);
43     local.setFk_money(fk_money);
44     local.setFk_summary(fk_summary);
45     local.setFk_date(fk_date);
46     local.setInput_man(input_operatorCode);
47     local.addFinacialcardInfoGuotou();
48     out.clear();
49     response.getWriter().write("1");
50 }catch(Exception e){
51     out.clear();
52     response.getWriter().write(e.getMessage());
53 }
54 
55 %>

 

 

這時候我接受到的數據會是中文亂碼,不管傳輸方式是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傳輸的代碼:

 1 function saveForm(){
 2     if(document.theformadd.onsubmit()){
 3         disableAllBtn(true);
 4         j$.ajax({
 5             type:"get",
 6             url:"add_form_do.jsp",
 7             data:{
 8                 problem_id : j$("#problem_id").val(),
 9                 product_id : "<%=product_id%>",
10                 productId : j$("#productId").val(),
11                 depart_id : j$("#depart_id").val(),
12                 fk_busi_id : j$("#fk_busi_id").val(),
13                 fk_type : j$("#fk_type").val(),
14                 fk_source : j$("#fk_source").val(),
15                 fk_info : encodeURI(j$("#fk_info").val()),
16                 fk_name : encodeURI(j$("#fk_name").val()),
17                 fk_bank_name : encodeURI(j$("#fk_bank_name").val()),
18                 fk_bank_acct : encodeURI(j$("#fk_bank_acct").val()),
19                 sk_name : encodeURI(j$("#sk_name").val()),
20                 sk_bank_name : encodeURI(j$("#sk_bank_name").val()),
21                 sk_bank_acct : encodeURI(j$("#sk_bank_acct").val()),
22                 fk_money : j$("#fk_money").val(),
23                 fk_summary : encodeURI(j$("#fk_summary").val()),
24                 fk_date : j$("#fk_date").val(),
25                 input_man : "<%=input_operatorCode%>"
26             },
27             success:function(ret){
28                 if(ret == 1) {
29                     sl_alert("保存成功!");
30                 }else{
31                     sl_alert(ret);
32                     
33                 }
34 
35                 window.returnValue=true;
36                 window.close();
37             
38                 
39             }
40         });
41     }
42 }

 

修復后add_form_do.jsp中獲取數據:

 1 <%@ 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.*" %>
 2 <script type="text/javascript" src="<%=request.getContextPath()%>/ext2.0/ext-base.js"></script>
 3 <script type="text/javascript" src="<%=request.getContextPath()%>/ext2.0/ext-all.js"></script>
 4 <%@ include file="/includes/operator.inc" %>
 5 <%
 6 try{
 7     product_id = Utility.parseInt(Utility.trimNull(request.getParameter("product_id")),product_id);
 8     
 9     UnpostwarrantLocal local = EJBFactory.getUnpostwarrant();
10     
11     Integer problem_id = Utility.parseInt(request.getParameter("problem_id"),new Integer(0));
12     
13     Integer depart_id = Utility.parseInt(request.getParameter("depart_id"),new Integer(0));        //部門
14     Integer productId = Utility.parseInt(Utility.trimNull(request.getParameter("productId")),product_id);
15     String fk_busi_id = Utility.trimNull(request.getParameter("fk_busi_id"));        //字典1206  費用
16     String fk_type = Utility.trimNull(request.getParameter("fk_type"));        //付款方式  2103
17     String fk_source = Utility.trimNull(request.getParameter("fk_source"));        //付款依據  2104
18     String fk_info = Utility.trimNull(request.getParameter("fk_info"));        //票據號碼
19     String fk_name = Utility.trimNull(request.getParameter("fk_name"));        //付款單位
20     String fk_bank_name = Utility.trimNull(request.getParameter("fk_bank_name"));        //付款銀行名稱
21     String fk_bank_acct = Utility.trimNull(request.getParameter("fk_bank_acct"));        //付款銀行賬號
22     String sk_name = Utility.trimNull(request.getParameter("sk_name"));        //收款單位
23     String sk_bank_name = Utility.trimNull(request.getParameter("sk_bank_name"));        //收款銀行名稱
24     String sk_bank_acct = Utility.trimNull(request.getParameter("sk_bank_acct"));        //收款銀行賬號
25     BigDecimal fk_money = Utility.parseDecimal(Utility.trimNull(request.getParameter("fk_money")).replaceAll(",",""),new BigDecimal(0));        //金額
26     String fk_summary = Utility.trimNull(request.getParameter("fk_summary"));        //備注
27     Integer fk_date = Utility.parseInt(request.getParameter("fk_date"),new Integer(Utility.getCurrentDate()));        //要求付款日期
28     
29     local.setProblem_id(problem_id);
30     //local.setProduct_id(product_id);
31     local.setProduct_id(productId);
32     local.setDepart_id(depart_id);
33     local.setFk_busi_id(fk_busi_id);
34     local.setFk_type(fk_type);
35     local.setFk_source(fk_source);
36     local.setFk_info(java.net.URLDecoder.decode(fk_info, "UTF-8"));
37     local.setFk_name(java.net.URLDecoder.decode(fk_name, "UTF-8"));
38     local.setFk_bank_name(java.net.URLDecoder.decode(fk_bank_name, "UTF-8"));
39     local.setFk_bank_acct(java.net.URLDecoder.decode(fk_bank_acct, "UTF-8"));
40     local.setSk_name(java.net.URLDecoder.decode(sk_name, "UTF-8"));
41     local.setSk_bank_name(java.net.URLDecoder.decode(sk_bank_name, "UTF-8"));
42     local.setSk_bank_acct(java.net.URLDecoder.decode(sk_bank_acct, "UTF-8"));
43     local.setFk_money(fk_money);
44     local.setFk_summary(java.net.URLDecoder.decode(fk_summary, "UTF-8"));
45     local.setFk_date(fk_date);
46     local.setInput_man(input_operatorCode);
47     local.addFinacialcardInfoGuotou();
48     out.clear();
49     response.getWriter().write("1");
50 }catch(Exception e){
51     out.clear();
52     response.getWriter().write(e.getMessage());
53 }
54 
55 %>

注意事項:

  如果是接受數據不是jsp頁面,而是Java類的時候,只需要URLDecoder.decode(value, "UTF-8");來解碼,然后導入相應的包。還有傳輸時可能需要兩次編碼encodeURI(encodeURI(j$("#fk_info").val())),具體原因是我們通過request.getParameter()來獲取數據時就會進行一次解碼操作,解碼時不變。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM