如果命令行有-Dfile.encoding 则使用其指定码制,如果没有,则强制使用 utf-8,如何比较优雅地实现? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
matepi
V2EX    Java

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

  •  
  •   matepi Jan 16, 2023 2079 views
    This topic created in 1197 days ago, the information mentioned may be changed or developed.

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

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

    结果是有值,为 GBK

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

    找了一下感觉得用 mbean……比较难看啊
    kenvix
        4
    kenvix  
       Jan 16, 2023
    我不觉得 if else 或者? :有什么不雅的
    v2wtf
        5
    v2wtf  
       Jan 16, 2023
    这有什么难的....

    启动的时候:

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

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

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

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

    @v2wtf
    @MineDog
    MineDog
        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 )
    }
    matepi
        11
    matepi  
    OP
       Jan 17, 2023
    @MineDog 用户视角来看,同义不同设置,有点矛盾。做是可以做。但就是主题里说的不优雅了。
    billlee
        12
    billlee  
       Jan 17, 2023 via Android
    一定要这个配置名,那就只能去 hack native 来获得命令行参数了
    matepi
        13
    matepi  
    OP
       Jan 17, 2023   1
    @billlee 不至于用 native 。用 ManagementFactory.getRuntimeMXBean().getInputArguments()就可以实现了。有个 1.7 以前确认不修的小 Bug:JDK-6459832 。而且 mbean 这种东西,不同种 jvm 、不同版本之间有稳定性。总觉得还是有点小不爽。
    matepi
        14
    matepi  
    OP
       Jan 17, 2023
    上面写错,mbean 有没有稳定性,有点担心。
    OpenJdk
        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;
    }
    About     Help     Advertise     Blog     API     FAQ     Solana     3209 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 44ms UTC 14:26 PVG 22:26 LAX 07:26 JFK 10:26
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86