4

少量のバイナリ データを文字列として SharedPreferences に書き込もうとしています。ここでエンコーディングをひどく誤解しているかもしれませんが、これが私がやろうとしていることです:

String str = new String("hi there!".getBytes(), "ISO-8859-1");

SharedPreferences p = context.getSharedPreferences("foo", MODE_PRIVATE);
Editor e = p.edit();
e.putString("string", str);
e.putBoolean("worked", true);
e.commit();

... later on after an app restart...

// the shared prefs file will be empty upon the next app start:
SharedPreferences p = context.getSharedPreferences("foo", MODE_PRIVATE);
Log.d(TAG, "String value present?: " + p.getString("string", null)); 
Log.d(TAG, "Boolean flag present?: " + p.getBoolean("worked", false));

commit() 呼び出しは true を返し、すべて問題ないようです。次にこのデモ アプリを起動すると、この共有設定インスタンスの内容が読み込まれますが、中身は完全に空です。「ISO-8859-1」エンコーディングを使用しない場合、すべてが期待どおりに機能し、共有設定ファイルにキー値が含まれています。

共有設定は、そのエンコーディングを使用する文字列で機能しませんか?

ありがとう

4

2 に答える 2

1

最初の行では、文字エンコーディングを指定せずに getBytes() が呼び出されているため、UTF8 バイトに変換しています。Latin-1 文字を使用しているため機能しますが、キリル文字またはギリシャ語を使用している場合はクラッシュします。とにかくこれのポイントは何ですか?文字列は UTF16 としてメモリに格納されます

于 2012-09-28T14:11:48.950 に答える
1

SharedPreferences はおそらく文字列を UTF-8 でエンコードされたものとして扱っており、ISO-8859-1 でエンコードされた文字列を指定しています。これら 2 つのエンコーディングには互換性がないため、この問題が発生している可能性があります。

ISO-8859-1 エンコーディングを使用する必要がありますか? エンコーディングを UTF-8 に設定するか、完全に空白のままにできますか (Java はデフォルトで UTF-16 でエンコードされたバイトとして保存すると思います)。可能な場合は、通常、これを使用する方が安全な選択です。

于 2012-09-28T14:12:22.990 に答える