2009-03-18 14 views
4

私はxhr呼び出しでいくつかの入力データを検証する必要があるイタリア語のWebサイトをコーディングしています。 AJAXリクエストのこのような(私はjQueryの1.3.2を使用しています)のための私のコード:IEの別のJQueryエンコーディング問題

$.ajaxSetup({ 
    type: "POST", 
    timeout: 10000, 
    contentType: "application/x-www-form-urlencoded; charset=iso-8859-1"   
}); 


$.ajax({ 
    url: "ajaxvalidate.do", 
    data: {field:controlInfo.field,value:controlInfo.fieldValue}, 
    dataType: "json", 
    complete: function() { 
     // 
    }, 
    success: function(msg) { 
     handleAsyncMsg(controlInfo, msg, closureOnError); 
    }, 
    error: function(xhr, status, e) {    
     showException(controlInfo.id, status); 

    } 

}); 

バックエンドでは、私はXHRを処理するためのJavaのStrutsアクションを持っています。私は、データ(特にアクセント記号付きの文字)が同期送信で正しく送信されるように、ページ内のエンコーディングISO-8859-1を使用する必要があります。

すべてがFirefoxの魅力のように機能していますが、アクセント付きの文字でIE 7の非同期ポストを処理する必要があるときは、問題があります:常に無効な文字(utf-8かもしれませんか? EG私はààààààààààの形式で入力し、私の要求にはこの値が入ります:ââ、ââ、¬ 要求文字セットがISO-8859-1に正しく設定されているため、サーバーが依然としてフォーム値を正しく解析していない理由を理解できません。

これは、すべてのリクエストヘッダおよびエラーのログサンプル(サーバが古いBEA WebLogicの8.1'S)である。

Encoding: ISO-8859-1 
Header: x-requested-with - Value: XMLHttpRequest 
Header: Accept-Language - Value: it 
Header: Referer - Value: https://10.172.14.36:7002/reg-docroot/conv/starttim.do 
Header: Accept - Value: application/json, text/javascript 
Header: Content-Type - Value: application/x-www-form-urlencoded; charset=iso-8859-1 
Header: UA-CPU - Value: x86 
Header: Accept-Encoding - Value: gzip, deflate 
Header: User-Agent - Value: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729) 
Header: Host - Value: 10.172.14.36:7002 
Header: Content-Length - Value: 65 
Header: Connection - Value: Keep-Alive 
Header: Cache-Control - Value: no-cache 
Header: Cookie - Value: JSESSIONID=JQJlNpVC86yTZJbcpt54wzt82TnkYmWYC5VLL2snt5Z8GTsQ1pLQ!1967684811 
Attribute: javax.net.ssl.cipher_suite - Value: SSL_RSA_WITH_RC4_128_MD5 
Attribute: javax.servlet.request.key-size - Value: 128 
Attribute: javax.servlet.request.cipher_suite - Value: TLS_RSA_WITH_RC4_128_MD5 
Attribute: javax.servlet.request.key_size - Value: 128 
Attribute: weblogic.servlet.network_channel.port - Value: 7001 
Attribute: weblogic.servlet.network_channel.sslport - Value: 7002 
Attribute: org.apache.struts.action.MESSAGE - Value: [email protected] 
Attribute: org.apache.struts.globals.ORIGINAL_URI_KEY - Value: /conv/ajaxvalidate.do 
Attribute: errors - Value: [email protected] 
Attribute: org.apache.struts.action.MODULE - Value: [email protected] 
Attribute: weblogic.servlet.request.sslsession - Value: [email protected] 
field: nome - value: àààààààà - action: /endtim 

答えて

4

のcontentType:「アプリケーション/ x-www-form-urlencodedで、文字セット= ISO-8859-1"

あなたはあなたがヘッダーにISO-8859-1として、フォームの送信を送っている言うことができますが、それはあなたが実際にあるという意味ではありません。 jQueryは、standand JavaScriptのencodeURIComponent()メソッドを使用してUnicode文字列をクエリ文字列のバイトにエンコードします。は常にでUTF-8を使用します。

いずれの場合でも、MIMEタイプ 'application/x-www-form-urlencoded'の 'charset'パラメータは非常に非標準的です。 'x-'型としてこの型の公式MIME登録はありませんが、HTML 4.01ではこのようなパラメータは指定されておらず、 'application/*'型の場合は非常に珍しいでしょう。 Weblogicは、この構造を検出して、それが価値があると主張します。

だから、あなたが何ができるかのいずれかです。

1:手動でISO-8859-1形式にそれをハッキング代わり

function encodeLatin1URIComponent(str) { 
    var bytes= ''; 
    for (var i= 0; i<str.length; i++) 
     bytes+= str.charCodeAt(i)<256? str.charAt(i) : '?'; 
    return escape(bytes).split('+').join('%2B'); 
} 

ようなものを使用して、POSTのボディform-urlencodedでコンテンツを自分で作成encodeURIComponent()の

2: 'charset'を失い、通常どおりUTF-8を送信したままにして、サーブレットが着信UTF-8を理解できるようにします。これは一般的には最適ですが、適切なエンコーディングを選択できるようにサーブレットコンテナコンフィグを設定することを意味します。 Weblogicの場合、これはweblogic.xmlのusing an <input-charset> elementを意味するようです。そしてそれまでにあなたのアプリケーション全体をUTF-8に動かすことに目を向けています。これは決して悪いことではありません(Unicode対応ではないWebサイトは20世紀のsoooです)!しかし、多くの作業になるかもしれません。

jQuery.ajaxSetup({ のcontentType:; "のcharset = UTF-8アプリケーション/ JSON"})

+0

ありがとうございました。私はページを変換しようとしますが、時間がかかります。 js encodeURI()を試してみましたが、うまくいきましたが、リクエスト・サーバー側から各フィールドを手動でデコードする必要がありました。私はutf-8にxhrを置くことも試みましたが、まだiso-8859-1のページがあり、うまくいくようです。本当に奇妙な.. –

2

は、実際には私が行うために必要なことを解決します。

IEのcontent-typeにapplication/x-www-form-urlencodedを追加する動作を無効にします。

0

私はスペイン語ポータルのコンテンツコメントシステムで同様の問題を抱えていました。 何時間にもわたって検索した結果、jQueryの文字セットを使いこなすのではなく、utf-8をutf-8からPHPのISO-8859-1にデコードすることになりました。 ajax POSTを処理しました。 PHPではutf8_decode()関数が組み込まれているので、コメント文字列で最初に行うことは次のとおりです。 $ comentario = utf8_decode($ _ POST ['comentario']);すべての上(の代わりに特殊文字のHTMLエンティティを保存するテキストを準備するために、その後、私は(nl2brを使用)とにhtmlentities()PHP関数)

グッドラック&平和! Seba