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 编码的字符串。这两种编码不兼容,因此这可能就是您看到此问题的原因。

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

于 2012-09-28T14:12:22.990 回答