Ajax伝送中文の文字化け問題の解決方法


AJAX概要
AJAX=Aynchronous JavaScript and XML(非同期のJavaScriptとXML)。
AJAXは新しいプログラミング言語ではなく、既存の標準を使う新しい方法です。
AJAXはサーバーとデータを交換し、一部のページを更新するアートで、ページ全体を再ロードしない場合です。
ajax伝送中文の文字化け問題の説明:
私はjspページに保存ボタンがあります。クリックするとsaveForm()のjs関数がトリガされます。saveForm()関数でチェックした後、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でも中国語で文字化けします。
ソリューション:
私たちは伝送時にデータを再符号化し、データを受け取る時に再復号することができます。文字化けの問題は、符号化フォーマットが衝突し、復号化された鍵のペアが前のフォーマットに対して解析エラーを引き起こし、文字化けを引き起こすことです。転送時には、中国語のデータを転送する必要がある前にエンコーディング()を追加します。info").val();中国語のデータを受け取る前にjava.net.URLDecoder.decode(value,「UTF-8」)を追加します。
String fk_bankname=Utility.trimNull(request.get Parameeter)bankname");String trans=java.net.URLDecoder.decode(fk_)bankname「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だけが必要です。を選択してデコードし、該当するパッケージをインポートします。また、伝送には二回のエンコーディング・デコレーションが必要かもしれません。info").val()は、request.getParameeter()によってデータを取得すると一回の復号操作が行われ、復号時はそのままです。
以上は小编が皆さんに绍介したAjax伝送中国语の文字化け问题の解决方法です。皆さんに助けてほしいです。ここでも私たちのサイトを応援してくれてありがとうございます。