jquery ajax が utf-8 でエンコードされている場合 (ページ utf-8、受信 utf-8)、問題はありません。通常どおり投稿と取得を行うことができ、ページを処理して正しいコンテンツを直接取得することができます。
2: 送信ページで ajax post メソッドを呼び出す前に、中国語のコンテンツを含む入力を encodeURIComponent で一度エンコードし、受信ページではデコード メソッド (例: java.net.urldecoder.decode("Content selected") を呼び出します。 、「utf-8」))。
その中で、最初の方法は間違いなく最も単純で直接的ですが、多くのプロジェクトでは utf-8 エンコードを使用していないため、多くの場合非現実的です。たとえば、ほとんどの国では gbk エンコードが使用されています。このような問題を解決するのは不可能です。プロジェクト全体を UTF-8 エンコードに変換するのはコストがかかりすぎ、危険です。
2 番目の方法は、現在ほとんどの人が使用している方法であり、一般的に二次エンコーディングと呼ばれています。なぜ二次エンコーディングと呼ばれるかについては、後で説明します。クライアントは 2 回エンコードし、サーバーは 2 回デコードします。ただし、この方法の欠点は、フロントエンドで一度手動でコーディングし、バックエンドで手動でデコードするため、注意しないと忘れてしまい、コードがフロントエンドのロジックと混在してしまうことです。
フォームを使用して従来の方法 (非 AJAX 送信) で投稿および送信すると、ブラウザーは現在のページに従ってエンコードし、一度エンコードしてからサーバーに送信します。サーバーはフォームを受信すると、自動的に一度デコードします。通常、このプロセスはプログラムに対して透過的であるため、手動でエンコードおよびデコードすると、上記の 2 番目のエンコードになります。
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 にアクセスして著者と連絡を取ることができます。