直接从 System.getProperty 拿到的 sun.jnu.encoding
类似在未指定的中文 windows 操作系统上
结果是有值,为 GBK
1
v2wtf 2023-01-16 16:03:49 +08:00
实现什么?你想达成什么效果?
|
2
zxCoder 2023-01-16 16:08:50 +08:00
if else
|
3
matepi OP @v2wtf 当用户使用我研发的命令行工具进行文件处理时时,有指定 file.encoding ,则使用用户所指定的 encoding 。否则就强制使用 UTF-8 ,而不是操作系统默认值。
找了一下感觉得用 mbean……比较难看啊 |
4
kenvix 2023-01-16 17:01:46 +08:00
我不觉得 if else 或者? :有什么不雅的
|
5
v2wtf 2023-01-16 17:02:53 +08:00
这有什么难的....
启动的时候: 全局变量 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 2023-01-17 09:39:38 +08:00
@matepi tmpEncoding 不为空,就不会进入 if 里,不会覆盖默认的 encoding = UTF8 ,所以最终结果还是 UTF8 ,这不正是你想要的吗?
|
8
MineDog 2023-01-17 10:38:06 +08:00
类似五楼,你在启动类的静态代码里写就行,保证第一时间执行
if(!Strings.isNullOrEmpty(System.getProperty("file.encoding")) { System.setProperty("file.encoding",UTF8) } |
9
matepi OP |
10
MineDog 2023-01-17 11:23:57 +08:00
@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 2023-01-17 14:13:51 +08:00 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 2023-01-18 09:42:49 +08:00
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 GetPropertyAction("file.encoding")); Charset cs = lookup(csn); if (cs != null) defaultCharset = cs; else defaultCharset = forName("UTF-8"); } } return defaultCharset; } |