2011-01-19 17 views
7

ちょっと、私はAjaxを使ってフォームに記入した後、サーバーから応答を取得するアラビア語の連絡先スクリプトを持っています。jQuery.parseJSON()がすべてのサーバーで動作しないのはなぜですか?

一部のApacheサーバーでは、jQuery.parseJSON()は、他のサーバーで完全に解析するのと同じjsonに対してinvalid jsonの例外をスローします。この例外は、chromeおよびIEでのみスローされます。

jsonのコンテンツは、PHPのjson_encode()機能を使用してエンコードされます。私は、jsonデータで正しいヘッダを送信し、ユニコードをutf-8に設定しようとしましたが、それは助けになりませんでした。

これは私が(それは長いですので、もし第二の部分を削除)を解析しようとJSONレスポンスのいずれかです。

{"pageTitle":"\u062e\u0637\u0623 \u0639\u0646\u062f \u0627\u0644\u0625\u0631\u0633\u0627\u0644 !"}

:このデータのこの言語はアラビア語で、それが理由ですそれはPHPのjson_encode()と解析された後、このように見えます。

以下の例でリクエストを行い、firebugまたはWebkit開発ツールを使用して完全な応答データを調べることができます。応答はjsonlintになります!

最後に、同じバージョンのスクリプトを使用して2つのURLがある場合は、クロムまたはIEを使用してそれらをブラウズして、壊れた例のエラーを確認してください。

実施例http://namodg.com/n/

壊れ例http://www.mt-is.co.cc/my/call-me/更新

もっと明確にするために、私は私が古いeval()を使用することによってこの問題を解決するためにうまく管理に注意したいと思いますコンテンツを解析するために、私はこの修正で別のバージョンをリリースしました。このようになりました:

// Parse the JSON data 
try 
{ 
    // Use jquery's default parser 
    data = $.parseJSON(data); 
} 
catch(e) 
{ 
    /* 
    * Fix a bug where strange unicode chars in the json data makes the jQuery 
    * parseJSON() throw an error (only on some servers), by using the old eval() - slower though! 
    */ 
    data = eval("(" + data + ")"); 
} 

これはjqueryのparseJSON()メソッドのバグかどうかを知りたいので、報告することができます。あなたはjson2.jsを使用してみてください

+0

どちらの例でも、evalまたはparseJSONのいずれも検出されません。 JSONが解析される場所へのヒントを教えてください。また、あなたのサンプルはchromiumのjQuery.parseでうまく解析されます – phihag

+0

私は 'eval()'を使う別のバージョン1.3.1をリリースしました。http://namodg.com/tryで見ることができます( 'send 'メソッドであるnamodg.main.js)。 parseJSONは '$ .ajax'データ型が' json'に設定されているときに自動的に使われます。 – Maher4Ever

答えて

6

問題が見つかりました。気づくのはとても難しいですが、私は何かを見ましたそのオープニングブレースについては面白いです...近くに小さな点がいくつかあるようでした。私はそれが何であったかを調べるために、このJavaScriptのブックマークレットを使用:

javascript:window.location='http://www.google.com/search?q=u+'+('000'+prompt('String?').charCodeAt(prompt('Index?')).toString(16)).slice(-4) 

私はthe results pageを得ました。問題が何であるかを推測してください!実際に出力の最初に2回繰り返される目に見えない文字があります。ゼロ幅の改行なしスペースは、Unicodeバイトオーダーマーク(BOM)とも呼ばれます。これは、jQueryがそうでなければ有効なJSONを拒否している理由とJSONLintにJSONを貼り付ける理由(あなたのやり方によって異なります)です。

この不要な文字を出力に取り込む1つの方法は、Windowsメモ帳を使用してUTF-8モードでPHPファイルを保存することです。これがあなたのやっていることならば、別のテキストエディタ、例えばNotepad++を入手してください。問題を解決するために、BOMなしですべてのPHPファイルを再保存してください。

ステップ1:デフォルトでBOMのないファイルをUTF-8でエンコードするようにNotepad ++を設定します。 UTF-8 without BOM setting in New Document tab of Preferences

ステップ2:を開き、各既存のPHPファイル、エンコードの設定を変更し、それを再保存。 Encoding...Encode in UTF-8 without BOM

+1

先生、ありがとうございます。私はBOMのためにあらゆる種類の問題を抱えていましたが、私は常にBOMなしでファイルを保存するようにしています。何が起こったのかは、設定​​ファイルを変更した後、壊れたサーバを持っている人が間違ったエンコーディングでファイルを保存したことです。私は同じ誤りを犯すユーザのために 'eval()'修正を使用する必要がありますが、少なくとも私は問題の原因を知っています。 :) – Maher4Ever

1

(それはhttps://github.com/douglascrockford/JSON-js上です)

でもジョンResigが(jQueryのの作成者)は、あなたがしなければならないと言う:

JSON.jsのこのバージョンを強くお勧めします。まだ古いバージョンを使用している場合は、アップグレードしてください(これは、間違いなく、前のバージョンよりも問題が少ないことを意味します)。

私はparseJSON(に関連する何も表示されません

http://ejohn.org/blog/the-state-of-json/

+0

このパーサーを指摘していただきありがとうございますが、なぜjQueryチームは独自のAPIではなくこの新しいAPIを使用していませんか? – Maher4Ever

+0

私はそれが含まれているjqueryのバージョンを把握することはできませんが、おそらく1.3.1ではなく、1.3.2に含まれるチケットを入手するためのhttp://bugs.jquery.com/ticket/4990チケットがあるからです。 – ajma

0

私が見る唯一の違いは、それがために必要とされていると思います(実施例では、セッションクッキーが設定されていることです"captcha"、数学的計算)、他の例ではセッションクッキーは設定されていません。したがって、おそらく計算結果の比較がセッションクッキーなしで失敗する可能性があります。

+0

キャプチャの答えは、キーを使って暗号化された隠しフィールド内にあるため、セッションはまったく必要ありません。サーバの応答ヘッダはほとんど同じですが、 'parseJSON'メソッドが破られています! – Maher4Ever

関連する問題