SharedPreferences与“ISO-8859-1”字符串有关吗?

时间:2012-09-28 13:51:33

标签: android sharedpreferences

我正在尝试将一小部分二进制数据作为字符串写入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,一切似乎都正常。下次我启动这个演示应用程序时,我读取了这个共享prefs实例的内容,它完全是空的。如果我不使用“ISO-8859-1”编码,那么一切都按预期工作,共享的prefs文件中包含键值。

共享prefs是否可以使用该编码的字符串?

由于

2 个答案:

答案 0 :(得分:1)

在第一行中调用getBytes()而不指定字符编码,因此您将转换为UTF8字节。它的工作原理是因为你使用的是latin-1字符,但是如果你使用的是西里尔字母或希腊语,它会崩溃。 无论如何,这有什么意义呢?字符串以UTF16格式存储在内存中

答案 1 :(得分:1)

SharedPreferences可能将字符串视为UTF-8编码,并且您正在为其提供ISO-8859-1编码的字符串。这两种编码不兼容,所以这可能是你看到这个问题的原因。

您必须使用ISO-8859-1编码吗?您可以将编码设置为UTF-8或将其完全留空(我相信Java会默认将其存储为UTF-16编码的字节)吗?这通常是一种更安全的选择,可以随时使用。