0

PHP.js の serialize package を使って、php でファイルに保存するオブジェクトデータをシリアライズしてみます。

Chrome: 正常 FF: 正常 IE9: 正常 互換モードの IE9 (基本的に IE7): 正常ではありません。

コンソールからのエラー:

SCRIPT5022: Exception thrown and not caught 
serialize.min.js, line 144 character 55

シリアル化されたデータは、基本的に次のようになります。

a:180:{s:40:"Aleksis Kiven tie 15<br>04200 Kerava<br>";a:2:{i:0;d:60.4012598;i:1;d:25.09659910000005;}

シリアル化されていない:

{"Aleksis Kiven tie 15<br>04200 Kerava<br>": [60.4012598, 25.09659910000005]}

キャッシュを処理する Javascript は次のようになります。

function saveCache(data) {
    sdata = serialize(data);
    $.ajax({
        type: 'POST',
        url: 'http://localhost/foobar/files/coordinates.php',
        data: {
            'do': 'write',
            'data': sdata
        }
    });
}

住所別のジオコーディング結果をテキスト ファイルにキャッシュしています。

意味が分からなかったらもっと聞いてください。

主な編集:指摘されたように例を修正しました。また、重要なことは、問題が実際に変わったことです。実際には serialize() の問題ではなく、unserialize() の問題です。

4

1 に答える 1

0

やっぱり自分で思いつきました。

よく見てみると、エラーの原因となったのは serialize() ではなく、私と同じパッケージにある unserialize() でした。

ある時点でキャッシュが破損し、何らかの理由で、comp-mode の IE9 が、私がテストしたブラウザーの中で、それを許容しなかった唯一のブラウザーでした。キャッシュが破損した理由は、utf8_encodes/decodes をスタックして、混乱を招き始めたことです。

次のようになりました。

  • キャッシュは、serialize() を使用して構築およびシリアル化されます。大丈夫。
  • PHP は、データが本当に UTF-8 であるかどうかをチェックし、それに応じて utf8_encode を実行します。データを保存します。大丈夫。
  • 次のページの読み込み。PHP は、AJAX を使用して格納されたデータを返します。念のため、UTF-8 ヘッダーが送信されます。data は unserialize()d され、それに応じて処理されます。大丈夫。
  • キャッシュは、新しいコンテンツと serialize()d で更新される可能性があります。シリアル化されたデータを警告すると、驚くべき結果が得られます。中国語の文字と破損が åäö! の代わりに表示されます。

解決策は、不要なutf8_decode( ) を実行する unserialize() にあります。ページはUTF-8です。すべての JavaScript ファイルは UTF-8 です。キャッシュされたデータは何度も UTF-8 であることが確認されます。したがって、UTF-8 をデコードする理由はありません。これがどのようにデータを正確に破壊したかは100%わかりませんが、utf8_decodeをコメントアウトすると問題が解決しました。

最新のブラウザーのエラー許容度には少しがっかりしています。高すぎる。でもまあ、わかってよかったです。

于 2012-09-06T06:08:02.860 に答える