E/System:忽略将 属性 "file.encoding" 设置为值 "ISO-8859-1" 的尝试

E/System: Ignoring attempt to set property "file.encoding" to value "ISO-8859-1"

当我在 Android Studio 中尝试此操作时,它忽略了编码,导致我的 program.But 出现灾难,当我在 java 中尝试此操作时,它没有任何问题。

System.setProperty("file.encoding","ISO-8859-1");
            Field charset = Charset.class.getDeclaredField("defaultCharset");
            charset.setAccessible(true);
            charset.set(null,null);

在日志中显示:

E/System: Ignoring attempt to set property "file.encoding" to value "ISO-8859-1"

如果安装了 SecurityManager,可以阻止设置系统 属性。一个 Android 应用程序可以预期在沙箱中 运行 这意味着有一个 SecurityManager 可以限制您可以设置的系统属性(可能有一些但不要指望它)。

常规 Java 应用程序通常 运行 没有 SecurityManager,因此设置此 属性 有效。

通常不需要在 运行 期间设置 file.encoding。如果您的应用程序在 file.encoding 没有特定值的情况下中断,您很可能在代码中做错了,例如从 byte[] 创建 String 而不指定要使用的字符集,反之亦然。

简而言之:为了让您的应用程序正常工作,您需要更改您的应用程序,例如

byte[] myBytes = myString.getBytes();
String mynewString = new String(myBytes);
InputStreamReader reader = new InputStreamReader(new FileInputStream(file));

byte[] myBytes = myString.getBytes("8859_1");
String mynewString = new String(myBytes, "8859_1");
InputStreamReader reader = new InputStreamReader(new FileInputStream(file), "8859_1");

哦还有更多:

Field charset = Charset.class.getDeclaredField("defaultCharset");
charset.setAccessible(true);
charset.set(null,null);

这真是一个 hack,你应该为此感到肮脏 ;-) 这并不能解决所有问题,例如当您执行 HTTP-requests 时,file.encoding 也用于决定应该使用什么字符集来编码 HTTP-request-header-values。其字符集值保存在不同 class 的不同成员中,与 JavaMail 等中的类似功能相同。更改 "internal" 成员中的 charset-values classes 很可能会破坏东西,所以不要那样做,正如我已经写过的那样,它应该是完全没有必要的。