ホームページ >ウェブフロントエンド >jsチュートリアル >GBK エンコード (非セカンダリ エンコード方式) での jQuery Ajax フォーム送信の究極のソリューション_jquery

GBK エンコード (非セカンダリ エンコード方式) での jQuery Ajax フォーム送信の究極のソリューション_jquery

WBOY
WBOYオリジナル
2016-05-16 18:18:161148ブラウズ
前書き:
jquery ajax が utf-8 でエンコードされている場合 (ページ utf-8、受信 utf-8)、問題はありません。通常どおり投稿と取得を行うことができ、ページを処理して正しいコンテンツを直接取得することができます。
ただし、次の場合:
GBK -> AJAX POST ->GBK
UTF-8 ->GBK
コードビハインドは正しいコンテンツを取得できません。通常は動作します 奇妙な文字、疑問符を取得します。
古典的な解決策:
1: 送信ページと受信ページの両方で UTF-8 エンコードを使用します。
2: 送信ページで ajax post メソッドを呼び出す前に、中国語のコンテンツを含む入力を encodeURIComponent で一度エンコードし、受信ページではデコード メソッド (例: java.net.urldecoder.decode("Content selected") を呼び出します。 、「utf-8」))。

その中で、最初の方法は間違いなく最も単純で直接的ですが、多くのプロジェクトでは utf-8 エンコードを使用していないため、多くの場合非現実的です。たとえば、ほとんどの国では gbk エンコードが使用されています。このような問題を解決するのは不可能です。プロジェクト全体を UTF-8 エンコードに変換するのはコストがかかりすぎ、危険です。
2 番目の方法は、現在ほとんどの人が使用している方法であり、一般的に二次エンコーディングと呼ばれています。なぜ二次エンコーディングと呼ばれるかについては、後で説明します。クライアントは 2 回エンコードし、サーバーは 2 回デコードします。ただし、この方法の欠点は、フロントエンドで一度手動でコーディングし、バックエンドで手動でデコードするため、注意しないと忘れてしまい、コードがフロントエンドのロジックと混在してしまうことです。
対話プロセス:
フォームを使用して従来の方法 (非 AJAX 送信) で投稿および送信すると、ブラウザーは現在のページに従ってエンコードし、一度エンコードしてからサーバーに送信します。サーバーはフォームを受信すると、自動的に一度デコードします。通常、このプロセスはプログラムに対して透過的であるため、手動でエンコードおよびデコードすると、上記の 2 番目のエンコードになります。
しかし、AJAX を使用して送信すると、ブラウザは自動的にエンコードしないため、jquery には次のようなコードがあります:
Copy code コードは次のとおりです:

ajax: function( s ) {
// 設定を拡張しますが、できるように 's' を再拡張します。
// 後で (具体的にはテスト スイート内で) 再度チェックします
s = jQuery.extend(true, s, jQuery.extend(true, {}, jQuery.ajaxSettings, s)); jsonp, jsre = /=?(&|$)/g, status, data,
type = s.type.toUpperCase()
// 文字列でない場合はデータを変換します
if ( s .data && s.processData && typeof s.data !== "string" )
s.data = jQuery.param(s.data);
....
}

上記は jquery の ajax メソッドのコード スニペットです。 以下は、jquery ajax post を通常に呼び出すためのコードです:

コードをコピー コードは次のとおりです:
$.ajax({
url: ajaxurl,
type: 'POST',
dataType: 'html',
timeout: 20000 ,//タイムアウト設定
data:para,//パラメータ設定
success: function(html){
}
});上記のコードから、データが設定されると、jquery が内部で jQuery.param メソッドを呼び出してパラメーターをエンコードする (ブラウザーによって処理されるべきエンコードを実行する) ことがわかります。



コードをコピー
コードは次のとおりです。 jQuery.param=function( a ) { var s = [ ];
function add( key, value ){
s[ s.length ] = encodeURIComponent(key) '=' encodeURIComponent(value); // 配列が渡された場合は、それが配列であると仮定します
// フォーム要素の配列
if ( jQuery.isArray(a) || a.jquery )
// フォーム要素をシリアル化します
jQuery .each( a, function(){
add( this.name, this.value );
}); それ以外の場合は、キーと値のペアのオブジェクトであると仮定します
else
// キー/値をシリアル化します
for ( var j in a )
// 値が配列の場合、キー名を繰り返す必要があります
if ( jQuery .isArray(a[ j]) )
jQuery.each( a[j], function(){
add( j, this );
});
else
add( j, jQuery.isFunction (a[j]) ? a[j]() : a[j] );
// 結果のシリアル化を返します
return s.join("&").replace(/ /g, " " );
}//jquery.param end


解決策:

encodeURIComponent は utf-8 でエンコードされます。gbk エンコードでは、gbk でエンコードできますか?

まだ encodeURIComponent について考えている場合は、申し訳ありませんが、encodeURIComponent は utf-8 のみをエンコードでき、他のエンコード用の API はありません。ただし、以下を参照してください。

encodeURIComponent。中国語や韓国語などの特殊文字を utf-8 形式の URL エンコードに変換します。

escape0-255以外のUnicode値をエンコードした場合、%u****形式で出力されます。それ以外の場合、escape、encodeURI、encodeURIComponentのエンコード結果は同じになります。 。

はは、希望は見えますか? encodeURIComponent メソッドの代わりに escape を使用しますが、注意する必要があります:

エスケープエンコードされていない文字が 69 個あります: *、,-、.、/、@、_、0-9、a-z、A-Z

encodeURIComponent エンコードされていない文字は 71 個あります: !、'、(,)、*、-、.、_、~、0 ~ 9、a ~ z、A ~ Z

escape を使用した後は、プラス記号をエンコードする必要があります。そうしないと、コンテンツにプラス記号が含まれる場合、サーバーによってスペースに変換されます。

ようやく解決策が分かりました。jquery コードを書き直します。

コードをコピーします コードは次のとおりです:

jQuery.param=function( a ) {
var s = [ ];
var encode=function(str){
str=escape(str); str.replace( / /g,"%u002B");
return str;
関数 add( key, value ){
s[ s.length ] = encode(key) '=' encode (value);
// 配列が渡された場合は、それがフォーム要素の配列であると仮定します
if ( jQuery.isArray(a) || a. jquery )
// フォーム要素をシリアル化します
jQuery.each( a, function(){
add( this.name, this.value );
}); >// それ以外の場合は、キー/値ペアのオブジェクトであると仮定します。
else
// キー/値をシリアル化します。
for ( var j in a )
// 値が配列の場合、キー名を繰り返す必要があります
if ( jQuery.isArray(a[j]) )
jQuery.each( a[j], function(){
add( j, this ) ;
}) ;
else
add( j, jQuery.isFunction(a[j]) ? a[j]() : a[j] );
return s. join("&").replace(/ /g, " ");


上記のコードを jquery ソース ファイルで書き直す必要はありません。プロジェクトに JavaScript を貼り付けて元のメソッドを上書きできますが、jquery がロードされた後に行う必要があります。

予備検証の後、上記のコードはおそらく Unicode にエンコードされているため、UTF-8 エンコードでも正常に動作します。

この方法では、フロントエンドとバックエンドの両方に影響を与える二次エンコーディングを使用する必要がありません。 gbk エンコーディングでの Ajax ポストはもはや問題ではありません。これが究極の解決策です。ははは。
興味のある方は、http://www.open-lib.com/Forum/Read_69_1.action にアクセスして著者と連絡を取ることができます。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。