如果命令行有-Dfile.encoding 则使用其指定码制,如果没有,则强制使用 utf-8,如何比较优雅地实现?

2023-01-16 15:53:03 +08:00
 matepi

直接从 System.getProperty 拿到的 sun.jnu.encoding

类似在未指定的中文 windows 操作系统上

结果是有值,为 GBK

1400 次点击
所在节点    Java
15 条回复
v2wtf
2023-01-16 16:03:49 +08:00
实现什么?你想达成什么效果?
zxCoder
2023-01-16 16:08:50 +08:00
if else
matepi
2023-01-16 16:16:39 +08:00
@v2wtf 当用户使用我研发的命令行工具进行文件处理时时,有指定 file.encoding ,则使用用户所指定的 encoding 。否则就强制使用 UTF-8 ,而不是操作系统默认值。

找了一下感觉得用 mbean……比较难看啊
kenvix
2023-01-16 17:01:46 +08:00
我不觉得 if else 或者? :有什么不雅的
v2wtf
2023-01-16 17:02:53 +08:00
这有什么难的....

启动的时候:

全局变量 encoding = UTF8;
tmpEncoding = System.getProperty("file.encoding");
if(!Strings.isNullOrEmpty(tmpEncoding) {
encoding = tmpEncoding;
}

// 后续所有操作都只需要用 encoding 就好了,你打开文件总要指定 encoding 的吧?通通用这个变量就好了
matepi
2023-01-16 19:07:39 +08:00
@v2wtf tmpEncoding 会在没有设置-Dfile.encoding 时,拿到操作系统的默认 encoding => 为 GBK ,不为空
v2wtf
2023-01-17 09:39:38 +08:00
@matepi tmpEncoding 不为空,就不会进入 if 里,不会覆盖默认的 encoding = UTF8 ,所以最终结果还是 UTF8 ,这不正是你想要的吗?
MineDog
2023-01-17 10:38:06 +08:00
类似五楼,你在启动类的静态代码里写就行,保证第一时间执行
if(!Strings.isNullOrEmpty(System.getProperty("file.encoding")) {
System.setProperty("file.encoding",UTF8)
}
matepi
2023-01-17 11:06:00 +08:00
实际 => 当没有设置 file.encoding 时,取 file.encoding 会取得操作系统默认的 GBK ,不为空。导致不能强制走 UTF-8 。

我需求 => 当没有设置 file.encoding 时,强制走 UTF-8 。有设置时,走用户设置。

Strings.isNullOrEmpty(System.getProperty("file.encoding")) 是永假的

@v2wtf
@MineDog
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 )
}
matepi
2023-01-17 11:34:35 +08:00
@MineDog 用户视角来看,同义不同设置,有点矛盾。做是可以做。但就是主题里说的不优雅了。
billlee
2023-01-17 14:13:51 +08:00
一定要这个配置名,那就只能去 hack native 来获得命令行参数了
matepi
2023-01-17 16:49:09 +08:00
@billlee 不至于用 native 。用 ManagementFactory.getRuntimeMXBean().getInputArguments()就可以实现了。有个 1.7 以前确认不修的小 Bug:JDK-6459832 。而且 mbean 这种东西,不同种 jvm 、不同版本之间有稳定性。总觉得还是有点小不爽。
matepi
2023-01-17 16:51:52 +08:00
上面写错,mbean 有没有稳定性,有点担心。
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;
}

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/909287

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX