3

私はlocalStorageを使用していくつかのバイナリデータを文字列形式で保存してきましたが、値は確実に設定されていますが(alert設定直後、または設定後しばらくすると正しい値が表示されます)、ページが次に読み込まれるときに失われます。

最初はデータにヌルバイトが含まれているのではないかと思ったので、出力されないようにコンプレッサーを再設計しました。ただし、値はまだ失われているため、これによる違いはありません。

localStorage.testing = 1バイナリデータを設定した直後に追加しました。この値は、もう一方が失われた場合でも保持されます。

にコードがないことは間違いありませんdelete localStorage.myitem

この問題の原因は何ですか?

それが役立つ場合は、これが私が保存しようとしているデータを16進数で示しています。

0x1103c0a0   0xd6cf0305   0xc0a0d6cf   0x0307c0a0   0xd6cf0309   0xc0a0d6cf
0x030bc0a0   0xd6cf030d   0xc0a0d6cf   0x0311c0a0   0xd6cf0313   0xc0a0d6cf   0x0301

編集:私はちょうどテストしました、localStorage.testvalue = realvalue.replace(/[\x00-\x1f]/g,'');そしてそれはそれを首尾よく保存しました。ですから、文字列で制御文字を使用できないという仕様がどこにあるのか知りたいのですが。

4

2 に答える 2

13

テストケースを設定し、さまざまなブラウザでテストを実行しました。結果は以下のとおりです(文字コードの包括的範囲が記載されています)。テストは、をサポートする最小のブラウザバージョンで開始されましたlocalStorage

  • Chrome 5-20:0x0000-0xFFFF
  • Opera 10.50-12.00:0x0000-0xFFFF
  • Safari 4.0-5.1.7:0x0000-0xFFFF
  • Firefox 3.5-16 alpha0x0000-0xD7FFおよび0xE000- 0xFFFE(0xD800-0xDFFFおよび0xFFFFはLSの後に2文字で変換されます)
  • IE8 、IE9、IE10 PP60x0009、、、-および- 。(他の範囲は無視されるか、「無効な引数」エラーが発生します)。はNULLバイトであり、IE内の後続のすべての文字を切り捨てます。0x000A0x000D0x00200xD7FF0xE0000xFFFD
    0x0000

したがって、文字範囲0x20-0xD7FFおよび0xE000-0xFFFDプラス、、0x09および0x0A安全0x0Dです。


3つのテストケースを作成しました。

  1. すべての文字を含む文字列を作成し、設定後に値をテストする最速のテストケースlocalStorage
  2. 長さ2の文字を作成するブラウザーを適切に処理するために、区切り文字としてスペース文字(0x20)を使用する方法。
  3. IEが無効な文字列に対してエラーをスローするため、最悪の方法。各キャラクターは個別にテストされますが、これは非常に高価です。

すべてのテスト機能はJSFiddleで使用でき、最初のテストケースは以下に表示されます。

function run_test(lowerlimit, UPPERLIMIT) {
    try {
        if (!window.localStorage) {
            // I recall that in one of the older Chrome version (4),
            // localStorage === null
            return 'Localstorage is not supported';
        }
        if (isNaN(lowerlimit) || isNaN(UPPERLIMIT) || lowerlimit > UPPERLIMIT) {
            return 'One of the limits is not a valid number!';
        }
        var i = lowerlimit - 1;
        var character_range = [];
        while (++i < UPPERLIMIT) character_range.push(i);
        input = String.fromCharCode.apply(String, character_range);
        localStorage.setItem('chartest', input);
        output = localStorage.getItem('chartest');
        if (input === output) {
            return true;
        }
        // Uh oh, not equal!
        var result = [];
        for (i=0; i<UPPERLIMIT-lowerlimit; i++) {
            if (input[i] !== output[i]) {
                result.push(i + lowerlimit);
            }
        }
        return result;
    }catch(e){return 'Error:' + e;}
}
于 2012-06-23T23:00:41.913 に答える
0

さらにテストした後、localStorageが文字列を格納すると言ったとき、それが実際に意味するのは、次のように一致する文字列を格納することです。

/^[\x00\x09\x0A\x0D\x20-\xff]*$/

したがって、HT、CR、LF、およびNULを除いて、スペースの前には何も許可されません。

とはいえ、理由はまだわかりません。

于 2012-06-23T15:45:56.027 に答える