Android Studio设置file.encoding为ISO-8859-1被忽略致程序异常求助
file.encoding=ISO-8859-1被系统忽略的问题 兄弟,我太懂你踩的这个坑了!在标准Java环境里改file.encoding明明顺顺利利,结果到了Android Studio里直接被系统无视,还蹦出E/System: Ignoring attempt to set property "file.encoding" to value "ISO-8859-1"这条日志,折腾得人够呛对吧?
为啥会出现这个问题?
本质原因是Android的ART/Dalvik虚拟机和标准JVM的设计不一样:Android为了系统稳定性和兼容性,直接锁定了file.encoding这个系统属性,不允许应用在运行时修改它。默认情况下Android的字符编码就是UTF-8,这个是硬规则,没法通过修改系统属性绕过去。
靠谱的解决方案
别跟系统硬刚,换下面这些方式解决:
显式在IO操作中指定编码(最推荐)
放弃全局修改file.encoding的想法,在需要用ISO-8859-1的地方直接指定编码,既安全又不会影响应用其他部分。比如:
读文件/处理字节数组:// 读取文件时指定编码 InputStreamReader reader = new InputStreamReader(new FileInputStream("target.txt"), StandardCharsets.ISO_8859_1); // 字节数组转字符串时指定编码 String content = new String(byteData, StandardCharsets.ISO_8859_1);写文件同理:
OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream("output.txt"), StandardCharsets.ISO_8859_1);仅单元测试场景:通过Gradle配置JVM参数
如果只是本地单元测试需要这个编码,可以在模块的build.gradle里加这段配置:test { jvmArgs "-Dfile.encoding=ISO-8859-1" }注意!这个只对本地跑的单元测试有效,真机/模拟器上的Instrumented测试依然没用,因为还是跑在ART虚拟机上。
重构代码,避免依赖默认编码
其实依赖file.encoding的代码本身就不太靠谱——不同环境默认编码可能不一样,很容易出兼容性问题。不管是Java还是Android,显式指定编码都是最佳实践,从根源上避免这类问题。
总的来说,Android就是不让你改这个系统属性,换显式指定编码的路子才是正确打开方式,既能解决问题又符合平台规范。
内容的提问来源于stack exchange,提问作者Sharanyo Chatterjee

