首页 > 解决方案 > 存储在 SharedPreferences 中的字符串在每个应用程序关闭时都会被修改?

问题描述

所以,自从过去 24 小时以来,我一直在思考这个问题,在我开始之前,让我明确一点,这个问题只发生在我的一个在棉花糖上运行的 android 手机上。

问题:

当我使用 StringRequest 检索字符串响应时,该字符串正是它应该是的,然后我将它保存到 SharedPreferences,并且无论我从 SharedPreferences 检索文件多少次,该值都保持正确(即相同)。但是当我关闭应用程序并重新启动它,并从 SharedPreferences 检索字符串时,字符串会以某种方式发生变化,长度减小,与从服务器新获取的相同字符串相比,.equals 返回 false,所以我猜测 SharedPreferences 修改了字符串值在 Android marshmallow 中独立运行。经过大量调试后,我编写了两个字符串(来自 sharedpreferences 和服务器)以将 .txt 文件分隔到内部存储,并使用 notepad++ 和 Voila! 打开它们,控制字符从“CR LF”更改为'如果',因此导致字符串的长度发生变化,尽管长度不同,但当我在许多在线网站上比较两个字符串时,他们都说“字符串完全相同!” :(

帮助伙计们!谢谢

标签: javaandroidjsonstringandroid-sharedpreferences

解决方案


千辛万苦,终于找到了根本原因。 在某些设备上,存储在 SharedPreferences 中的字符串值会修改其 EOL 字符。字符串中的换行符被转换为其他\n内容,而不是减少字符串的长度。每个换行符都会将字符串的长度减少 1 位。解决方案很简单:

\n每次从 SharedPreferences 检索字符串后,将所有换行符替换为。

String fixedString = problemString.replace(System.getProperty("line.separator"),"\\\n" );

此外,如果您的字符串包含手动格式化的字符串,其中包含除 之外的换行符\n,您应该使用这个:

String fixedString = problemString.replace("\r\n|\n|\r", "\\\n");

更新

如果您有一个已经使用 unix EOL 字符格式化的字符串,上述解决方案将导致问题,如果您有多个使用不同 EOL 字符格式化的字符串,则无法使用。所以我发现最好的方法是只替换由\r

String fixedString = brokenString.replace("\r", "");

此方法将删除字符串中的所有回车符,因此字符串从 (Windows CR LF) 格式转换为 (Unix LF) 格式。每个换行符的长度将减少 1 位。:)


推荐阅读