V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
matepi
V2EX  ›  Java

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

  •  
  •   matepi · 2023-01-16 15:53:03 +08:00 · 1406 次点击
    这是一个创建于 682 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    结果是有值,为 GBK

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

    找了一下感觉得用 mbean……比较难看啊
    kenvix
        4
    kenvix  
       2023-01-16 17:01:46 +08:00
    我不觉得 if else 或者? :有什么不雅的
    v2wtf
        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 的吧?通通用这个变量就好了
    matepi
        6
    matepi  
    OP
       2023-01-16 19:07:39 +08:00
    @v2wtf tmpEncoding 会在没有设置-Dfile.encoding 时,拿到操作系统的默认 encoding => 为 GBK ,不为空
    v2wtf
        7
    v2wtf  
       2023-01-17 09:39:38 +08:00
    @matepi tmpEncoding 不为空,就不会进入 if 里,不会覆盖默认的 encoding = UTF8 ,所以最终结果还是 UTF8 ,这不正是你想要的吗?
    MineDog
        8
    MineDog  
       2023-01-17 10:38:06 +08:00
    类似五楼,你在启动类的静态代码里写就行,保证第一时间执行
    if(!Strings.isNullOrEmpty(System.getProperty("file.encoding")) {
    System.setProperty("file.encoding",UTF8)
    }
    matepi
        9
    matepi  
    OP
       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
        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 )
    }
    matepi
        11
    matepi  
    OP
       2023-01-17 11:34:35 +08:00
    @MineDog 用户视角来看,同义不同设置,有点矛盾。做是可以做。但就是主题里说的不优雅了。
    billlee
        12
    billlee  
       2023-01-17 14:13:51 +08:00 via Android
    一定要这个配置名,那就只能去 hack native 来获得命令行参数了
    matepi
        13
    matepi  
    OP
       2023-01-17 16:49:09 +08:00   ❤️ 1
    @billlee 不至于用 native 。用 ManagementFactory.getRuntimeMXBean().getInputArguments()就可以实现了。有个 1.7 以前确认不修的小 Bug:JDK-6459832 。而且 mbean 这种东西,不同种 jvm 、不同版本之间有稳定性。总觉得还是有点小不爽。
    matepi
        14
    matepi  
    OP
       2023-01-17 16:51:52 +08:00
    上面写错,mbean 有没有稳定性,有点担心。
    OpenJdk
        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;
    }
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3247 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 13:10 · PVG 21:10 · LAX 05:10 · JFK 08:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.