
直接从 System.getProperty 拿到的 sun.jnu.encoding
类似在未指定的中文 windows 操作系统上
结果是有值,为 GBK
1 v2wtf Jan 16, 2023 实现什么?你想达成什么效果? |
2 zxCoder Jan 16, 2023 if else |
3 matepi OP @v2wtf 当用户使用我研发的命令行工具进行文件处理时时,有指定 file.encoding ,则使用用户所指定的 encoding 。否则就强制使用 UTF-8 ,而不是操作系统默认值。 找了一下感觉得用 mbean……比较难看啊 |
4 kenvix Jan 16, 2023 我不觉得 if else 或者? :有什么不雅的 |
5 v2wtf Jan 16, 2023 这有什么难的.... 启动的时候: 全局变量 encoding = UTF8; tmpEncoding = System.getProperty("file.encoding"); if(!Strings.isNullOrEmpty(tmpEncoding) { encoding = tmpEncoding; } // 后续所有操作都只需要用 encoding 就好了,你打开文件总要指定 encoding 的吧?通通用这个变量就好了 |
6 matepi OP @v2wtf tmpEncoding 会在没有设置-Dfile.encoding 时,拿到操作系统的默认 encoding => 为 GBK ,不为空 |
7 v2wtf Jan 17, 2023 @matepi tmpEncoding 不为空,就不会进入 if 里,不会覆盖默认的 encoding = UTF8 ,所以最终结果还是 UTF8 ,这不正是你想要的吗? |
8 MineDog Jan 17, 2023 类似五楼,你在启动类的静态代码里写就行,保证第一时间执行 if(!Strings.isNullOrEmpty(System.getProperty("file.encoding")) { System.setProperty("file.encoding",UTF8) } |
9 matepi OP |
10 MineDog Jan 17, 2023 @matepi #9 那是不是可以自定义一个配置名,不要让用户用 file.encoding 来指定编码集呢。 比如 String uEncoding = System.getProperty("user.file.encoding"); if(Strings.isNullOrEmpty(uEncoding)) { System.setProperty("file.encoding",UTF8); }else{ System.setProperty("file.encoding",uEncoding ) } |
12 billlee Jan 17, 2023 via Android 一定要这个配置名,那就只能去 hack native 来获得命令行参数了 |
13 matepi OP @billlee 不至于用 native 。用 ManagementFactory.getRuntimeMXBean().getInputArguments()就可以实现了。有个 1.7 以前确认不修的小 Bug:JDK-6459832 。而且 mbean 这种东西,不同种 jvm 、不同版本之间有稳定性。总觉得还是有点小不爽。 |
14 matepi OP 上面写错,mbean 有没有稳定性,有点担心。 |
15 OpenJdk Jan 18, 2023 Open JDK8 里面 CharSet.defaultCharSet()默认不是返回 UTF-8 吗? /** * Returns the default charset of this Java virtual machine. * * <p> The default charset is determined during virtual-machine startup and * typically depends upon the locale and charset of the underlying * operating system. * * @return A charset object for the default charset * * @since 1.5 */ public static Charset defaultCharset() { if (defaultCharset == null) { synchronized (Charset.class) { String csn = AccessController.doPrivileged( new GetPropertyActon("file.encoding")); Charset cs = lookup(csn); if (cs != null) defaultCharset = cs; else defaultCharset = forName("UTF-8"); } } return defaultCharset; } |