当我在Android Studio中尝试这个时,它忽略了编码,导致我的程序出现了灾难。但是当我在java上尝试这个时,它没有任何问题。
System.setProperty("file.encoding","ISO-8859-1");
Field charset = Charset.class.getDeclaredField("defaultCharset");
charset.setAccessible(true);
charset.set(null,null);
显示在日志上:
E / System:忽略尝试设置属性" file.encoding"重视" ISO-8859-1"
答案 0 :(得分:0)
如果安装了SecurityManager,则可以防止设置系统属性。 Android应用程序可以在沙箱中运行,这意味着有一个SecurityManager可以撤销您可以设置的系统属性(可能有一些但不依赖它)。
常规Java应用程序通常在没有SecurityManager的情况下运行,因此设置此属性可以正常工作。
通常在运行时设置file.encoding是不必要的。如果您的应用程序在file.encoding
没有特定值的情况下中断,您很可能在代码中出错了,例如:创建String
froma byte[]
而不指定要使用的字符集,反之亦然。
简而言之:为了使您的应用程序正常工作,您需要从例如
更改您的应用程序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);
这是一个非常黑客,你应该感到肮脏;-)这不会解决所有问题,例如当您执行HTTP请求时,还使用file.encoding
来决定应该使用哪个字符集来编码HTTP-request-header-values。它的charset值保存在不同类的不同成员中,对于JavaMail中的类似功能也是如此。更改“内部”类成员中的charset-values很可能会破坏事物,所以不要这样做,正如我已经写过的,应该完全没必要。