• 解决java在idea运行正常,但是打成jar包后中文乱码问题


    目录

    比如: 打包命令使用utf-8编码:


    1.当在idea中编写的程序,运行一切正常.但是当被打成jar包时,执行的程序会中文乱码.产生问题的原因和解决方案是什么呢?

    一.问题分析
    分别使用idea和jar包形式打印出System中所有的jvm参数---代码如下:

    public static void main(String[] args) {
     
            printEnv();
     
            //读取excel
            ExcelUtil.simpleRead(Constant.EXCEL_PATH, AddedTax.class, 0, new AddedTaxListenner());
     
        }
     
     
        private static void printEnv(){
            //获取环境变量
            Map<String, String> envs = System.getenv();
            envs.forEach( (key,value) ->{
                //System.out.println("env---key是: "+key +" ; "+"env---value是: "+ value);
            });
     
            //获取jvm属性
            Properties properties = System.getProperties();
            properties.forEach((key, value) -> {
                System.out.println("jvm---key是: "+key +" ; "+"jvm---value是: "+ value);
            });
     
     
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25


     
     

    idea的打印结果:

    jvm---key是: user.name ; jvm---value是: ZHULIBIN10
    jvm---key是: file.encoding ; jvm---value是: UTF-8
    jvm---key是: java.specification.version ; jvm---value是: 1.8
    jvm---key是: java.awt.printerjob ; jvm---value是: sun.awt.windows.WPrinterJob
    jvm---key是: user.timezone ; jvm---value是: Asia/Shanghai
    jvm---key是: user.home ; jvm---value是: C:\Users\zhulibin10
    jvm---key是: os.version ; jvm---value是: 10.0
    jvm---key是: sun.management.compiler ; jvm---value是: HotSpot 64-Bit Tiered Compilers
    jvm---key是: java.specification.name ; jvm---value是: Java Platform API Specification
    jvm---key是: java.class.version ; jvm---value是: 52.0

    jar包的打印结果:

     如上图所示:

     问题就在这里,当使用idea时候,file.encoding的值是UTF-8; 使用jar包运行则file.encoding的值是GBK,这是导致乱码的直接原因.

    java 乱码问题解决: -Dfile.encoding=UTF-8
     

    -Dfile.encoding 解释:
    在命令行中输入 java,在给出的提示中会出现 -D 的说明:
    -D= # set a system property
    -D 后面需要跟一个键值对,作用是设置一项系统属性
    对 -Dfile.encoding=UTF-8 来说就是设置系统属性 file.encoding 为 UTF-8
    那么 file.encoding 什么意思?字面意思为文件编码。
    搜索 java 源码,只能找到 4 个文件中包含 file.encoding 的文件,
    也就是说,只有四个文件调用了 file.encoding 这个属性。
    在 java.nio.charset 包中的 Charset.java 中,这段话的意思说的很明确了。
    简单说就是默认字符集是在 java 虚拟机启动时决定的,
    依赖于 java 虚拟机所在的操作系统的区域以及字符集。
    代码中可以看到,默认字符集就是从 file.encoding 这个属性中获取的。

    二.问题解决总结:

     不管在任何平台,启动jar包的方式: java -jar  -Dfile.encoding=utf-8 YourName.jar

    比如: 打包命令使用utf-8编码

    java -jar  -Dfile.encoding=utf-8 项目包名字.jar


    三.解决cmd格式下输出乱码:
    可写一个启动bat,将start.bat改为java -jar  -Dfile.encoding=utf-8 YourName.jar,问题就可以轻松解决。

    如果还未解决,请修改cmd程序的编码注册表信息:

    对于编译出的程序,在 cmd 和 power shell 运行时都不能正确显示汉字。 
    网上查,可以再命令窗口修改: 
    1、打开CMD.exe命令行窗口 
    2、通过 chcp命令改变代码页,UTF-8的代码页为65001 
    chcp 65001 
    执行该操作后,代码页就被变成UTF-8了。
    在当前窗口的确可以解决问题,但是重新打开的cmd窗口或者power shell 窗口仍然不能正确显示汉字。

    ————————————————
    版权声明:本文为CSDN博主「魔都Thomas」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/qq_42058242/article/details/114933003 

  • 相关阅读:
    使用sipParseArgs/sipBuildResult进行python/C++对象的转换
    Latex在同一figure中排版多张图片的方法
    Java面试题总结(一)
    前缀和(区间和,子矩阵的和)
    springboot毕设项目宠物社区网站mud2d(java+VUE+Mybatis+Maven+Mysql)
    导师转我800块,让我仿真一个电路(电源设计)
    MATLAB垃圾分类识别
    MSP430F5529时钟系统配置
    Twitter图片数据优化的细节
    scala基础入门
  • 原文地址:https://blog.csdn.net/qq_43563538/article/details/134459463